【数据结构之树】——什么是树,树的特点,树的相关概念和表示方法以及在实际的应用。

简介: 一、1.树是什么?树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。

一、1.树是什么?

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因
为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。


00af0e0578644a2e8a776d594f35f234.png

2.树的特点

1.有一个特殊的结点,称为根结点,根节点没有前驱结点

2.除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合

Ti(1<= i<= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继

3.因此,树是递归定义的

二、树的相关概念

以这张图为例:

c429ad46e8ea4318bfdc39206090eb9c.png

加粗的概念特点是需要记住的,没有加粗的概念了解就行。


1.节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6


2、叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I…等节点为叶节点


3、非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G…等节点为分支节点


4、双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点


5、孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点


6、兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点


7、树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6

 8、节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;


9、树的高度或深度:树中节点的最大层次; 如上图:树的高度为4


需要注意的是:树的高度有两种说法: 第一种说法是以0为开始计算树的高度(仿照数组下标从0开始)

但是这样计算的缺点是:假如一棵树是空树,就得从-1开始,不太符合常理。


第二种说法就是从1开始,这种是推荐的。

8f5ad358c8d94bec97d5a2f39b92e794.png

10、堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点


11、节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先


12、子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙


13、森林:由m(m>0)棵互不相交的树的集合称为森林;

三、树的表示方法

1.常规方法表示树

所谓常规方法,就是定义一个结构体,每个节点的度是多少,就定义多少个指针变量来存放子节点的地址。

但是这样做非常挫, 因为不是每个节点的度都相同,有可能有的节点的度是8个,有的节点的度是1个, 那么剩下的七个指针变量就没有用处了。

所以这种方法不可取。

2.使用左孩子右兄弟表示法

685532b1b62541499f212c2ae2c989e6.png

左孩子右兄弟表示方法如上图:

每个节点都只使用两个指针变量,一个指针变量存放该节点的第一个孩子的地址,另一个指针变量存放该节点的兄弟节点。

同层级是兄弟关系,上下层级是亲子关系。

这样做的优点是:不管一棵树有多少个节点,一定能够使用这种方法表示整个树的结构。

结构体源码如下

typedef int BTDataType;
struct Node 
{
struct Node* firstChild; // 第一个孩子结点
struct Node* pNextBrother; // 指向其下一个兄弟结点
BTDataType data; // 结点中的数据域
};

3. 使用顺序表来存储父亲节点的下标

0616df44bf434658914ae34d41025bfc.png

以上图为例:

A是整棵树的根节点,所以A没有父节点,它的下标存储-1(代表没有父节点),B~G的父亲节点都是A,所以 B ~ G 存储的下标都是A的下标,也就是0,代表它们的父亲节点在下标为0位置处。

其他的以此类推。

三、树在实际的应用


3a6cc82d63c94b1fa0733b5f23afdb26.png

这是一棵典型的树,可以用来表示文件目录。

总结

树是一种特殊的数据结构,在实际生活种有很多用处,学好树,就是一个质的飞跃

相关文章
|
1月前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
197 86
|
3月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
86 1
|
3月前
|
存储 监控 算法
公司员工泄密防护体系中跳表数据结构及其 Go 语言算法的应用研究
在数字化办公中,企业面临员工泄密风险。本文探讨使用跳表(Skip List)数据结构优化泄密防护系统,提升敏感数据监测效率。跳表以其高效的动态数据处理能力,为企业信息安全管理提供了可靠技术支持。
88 0
|
7月前
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
166 3
 算法系列之数据结构-Huffman树
|
7月前
|
存储 自然语言处理 数据库
【数据结构进阶】AVL树深度剖析 + 实现(附源码)
在深入探讨了AVL树的原理和实现后,我们不难发现,这种数据结构不仅优雅地解决了传统二叉搜索树可能面临的性能退化问题,还通过其独特的平衡机制,确保了在任何情况下都能提供稳定且高效的查找、插入和删除操作。
542 19
|
8月前
|
DataX
☀☀☀☀☀☀☀有关栈和队列应用的oj题讲解☼☼☼☼☼☼☼
### 简介 本文介绍了三种数据结构的实现方法:用两个队列实现栈、用两个栈实现队列以及设计循环队列。具体思路如下: 1. **用两个队列实现栈**: - 插入元素时,选择非空队列进行插入。 - 移除栈顶元素时,将非空队列中的元素依次转移到另一个队列,直到只剩下一个元素,然后弹出该元素。 - 判空条件为两个队列均为空。 2. **用两个栈实现队列**: - 插入元素时,选择非空栈进行插入。 - 移除队首元素时,将非空栈中的元素依次转移到另一个栈,再将这些元素重新放回原栈以保持顺序。 - 判空条件为两个栈均为空。
|
9月前
|
存储 C++
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
213 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
9月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
170 10
|
11月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
237 59
|
4月前
|
编译器 C语言 C++
栈区的非法访问导致的死循环(x64)
这段内容主要分析了一段C语言代码在VS2022中形成死循环的原因,涉及栈区内存布局和数组越界问题。代码中`arr[15]`越界访问,修改了变量`i`的值,导致`for`循环条件始终为真,形成死循环。原因是VS2022栈区从低地址到高地址分配内存,`arr`数组与`i`相邻,`arr[15]`恰好覆盖`i`的地址。而在VS2019中,栈区先分配高地址再分配低地址,因此相同代码表现不同。这说明编译器对栈区内存分配顺序的实现差异会导致程序行为不一致,需避免数组越界以确保代码健壮性。
75 0
栈区的非法访问导致的死循环(x64)

热门文章

最新文章

下一篇
oss教程