【数据结构入门】树
目录
1.树的概念
父子结点
根节点|叶节点
结点的度
叶子结点或终端结点
兄弟结点
树的度
结点的层次
树的高度或深度
结点的祖先
堂兄弟结点
子孙
森林
2. 树的结构定义
2.1 左孩子右兄弟结构
2.2 数组表示法
3.树&非树
1.树的概念
树是一种非线性的数据结构,它是由N(N>=0)个有限节点组成的一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树。也就是说它是根朝上,叶朝下的。
我们发现树是有一个一个节点构成的,如果一个节点都没有,我们称作“空树”。
父子结点
通常由一个结点延伸出来的直接结点称作该结点的子结点;例如下图中:1号结点是2号结点的父结点,2号结点是1号结点的子结点。
根节点|叶节点
没有父结点的结点称为根结点;
没有子结点的结点称为叶结点。
结点的度
一个结点含有的子树的个数称为该结点的度,上图A的度为6;
叶子结点或终端结点
度为0的节点称为叶结点,上图BCHIPQKLMN,都是叶结点。
兄弟结点
拥有相同的父结点的结点称为兄弟结点,例如KLM是兄弟结点。
树的度
最大结点的度称为树的度,上图中树的度是6
结点的层次
从根开始,根为第一层,根的子结点称为第2层,以此类推。
树的高度或深度
树中结点层次最大的。如上图树的高度为4;
结点的祖先
从根到该结点经过的所有结点,如上图A是所有结点的祖先,P的祖先是AEJ;
堂兄弟结点
双亲在同一层的结点互为堂兄弟结点,例如HI是堂兄弟结点。
子孙
以某节点为根的子树都叫做该结点的子孙。
森林
由M(M>0)棵互不相交的树的集合称为森林。
2. 树的结构定义
当已知数的度是多少的情况下可以定义树的结构:
#define _CRT_SECURE_NO_WARNINGS
#define N 3 // 假设度为3
typedef struct TreeNode
{int val;struct TreeNode* child1[N];
}TreeNode;
在windows文件资源管理器中,其实就是一棵树,盘符是根结点,但是这棵树没有规定究竟有多少个子节点,也就是说这里没有提前定义这棵树的度。上面那种定义会存在一定程度上的内存浪费。
我们可以使用顺序表来存,顺序表的每一个元素都是一个结点的指针,这种定义的方式显然也不够好,在底层也会有一定程度的空间浪费。
typedef struct TreeNode
{int val;TreeNodeSeqList childs;
}TreeNo
2.1 左孩子右兄弟结构
在树中有一种非常清晰明了的结构,结构体中存有两个指针,一个指针指向左边第一个孩子,第二个指针指向它的兄弟(亲兄弟)。
typedef struct TreeNode
{int val;TreeNode LeftChild;TreeNode RightBrother;
}TreeNode;
如图:
我们使用左孩子右兄弟的表示方法表示上面的树:
通过访问根结点的左边第一个孩子,再通过访问它的右兄弟就能将A节点的所有孩子全部访问。
2.2 数组表示法
定义两个数组,第一个数组是存放所有的结点;
第二个数组根据每一个结点存放对应的父结点的下标。
例如A没有父结点,存-1;
B、C的父结点是A,存A的下标0......
3.树&非树
①子树是不相交的。
②每一个结点有且只有一个父结点。
③N个节点有N-1条边。
只需要看树是否构成回路。