树是一种数据结构。
树的概念
树的定义
树是n个结点的有限集合(记为T)。
形式化定义(二元组)
树:$T=(D,R)$。
$D$ 是包含n个结点的有限集合 $n>0$ 。
当n=0时,称该树为空树。 当n>0时,这n个结点中存在一个唯一结点作为树的根结点,其余结点可分为m个互不相交的有限集 $T_1,T_2,…,T_m$ ,其中每个集合本身又是一棵树,称为根的子树。
$R$ 是D上的一个关系,$R\subset D\times D$ 。
树的表示
逻辑表示法
即我们平时常见的树形图
文氏图表示法
凹入表示法
括号表示法
例如:
A(B(D,E),C(F,G))
树的基本术语
结点的度和树的度
树中一个结点的子树的个数称为该结点的度。
树中各个结点的度的最大值称为树的度,通常若树的度为m,称该树为m叉树。
分支结点与叶结点
度不为0的结点称为非终端结点,也称为分支结点。
度为0的结点称为终端结点,也称为叶结点。
路径与路径长度
两个结点$d_i$和$d_j$之间的路径为从$d_i$到$d_j$的结点序列。
路径的长度为路径上的结点个数减一。
孩子结点、双亲结点和兄弟结点
每个结点的后继结点称为该结点的孩子结点。
该结点被称为孩子结点的双亲结点。
具有相同双亲结点的结点称为兄弟结点。
深度优先搜索 从根结点出发,沿着一条路径搜索,直到到达一个叶子结点,然后回溯,继续沿着另一条路径搜索,直到到达另一个叶子结点,以此类推。
一般采用递归的方式实现。
广度优先搜索 从根结点出发,先访问所有的兄弟结点,再访问所有的孩子结点,以此类推。
一般采用队列的方式实现。
子孙结点和祖先结点
子孙结点:从根结点到该结点的路径上的所有结点称为该结点的子孙结点。
祖先结点:从该结点到根结点的路径上的所有结点称为该结点的祖先结点。
结点的层次和高度
- 待补充
有序树和无序树
若树中各结点的子树从左到右是有次序的,且相对次序是不能随意变换的,称该树为有序树。否则,称该树为无序树。
森林
n个互不相交的树的集合称为森林。
给m棵独立的树加一个根结点,则森林就变成了一棵树。
树的性质
- 树中的结点数等于所有结点的度数加1。(加1是加上根结点)
- 度为m的树的其他重要特性:
- 结点个数为n,$n=n_0+n_1+n_2+…+n_m$,其中$n_0$为度数为0的结点数,$n_1$为度数为1的结点数,$n_2$为度数为2的结点数,以此类推。
- 所有结点度之和=$n_1+2n_2+3n_3+…+mn_m=n-1$。
- 度为m的树中第i层上至多有$m^{i-1}$个结点。
- 高度为h的m叉树至多有$\frac {m^h-1}{m-1}$个结点。
- 具有n个结点的m叉树的最小高度为$\lceil log_m(n(m-1)+1) \rceil$,最大高度为$n-m+1$。
树的基本运算
树的遍历运算是指按某种方式访问树中的每个结点,且每个结点仅被访问一次。
主要的遍历方法:
- 先根遍历
- 先访问根结点,再依次先根遍历各子树。
- 后根遍历
- 先依次后根遍历各子树,再访问根结点。
- 层次遍历
- 从第一层(根结点)开始,从上到下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。
注意:先根遍历和后根遍历都是使用递归实现的。
树的储存结构
双亲储存结构
typedef struct{
ElemType data;//结点的值
int parent;//指向双亲结点的伪指针
}PTree[MaxSize];
孩子储存结构
typedef struct{
ElemType data;//结点的值
struct node *sons[MaxSons];//指向孩子结点的指针
}TSonNode;
孩子兄弟储存结构
typedef struct{
ElemType data;//结点的值
struct node *firstson;//指向第一个孩子结点的指针
struct node *nextbrother;//指向右兄弟结点的指针
}TSBNode;
使用链表实现
二叉树
二叉树的定义
二叉树是
- 满二叉树
- 所有结点都有两个孩子结点。
- 所有叶子结点都在同一层。
满二叉树的性质 高度为h的满二叉树的结点个数为$2^h-1$。
- 完全二叉树
- 只有最下面两层有叶子结点。
- 最下面一层的叶子结点都集中在最左边。
二叉树的性质
- 非空二叉树上叶结点数等于双分支结点数加1。即:$n_0=n_2+1$。
求解一般二叉树结点个数方法 度之和=$n-1$。 $n=n_0+n_1+n_2$。 又:$n_0=n_2+1$。 得:$n=n_1+2n_2+1$。
- 非空二叉树上第i层上至多有$2^{i-1}$个结点。
- 完全二叉树的性质
- $n_1=0$或$n_1=1$,由n的奇偶性决定,n为奇数时$n_1=1$,n为偶数时$n_1=0$。
- 若一个结点的编号为i,则该结点的左孩子的编号为$2i$,右孩子的编号为$2i+1$。
并查集
并查集是一种树形的数据结构,用于处理不相交集合(Disjoint Sets) 的合并与查询问题。它特别适合解决动态连通性问题,比如判断两个元素是否属于同一个集合,或将两个集合合并。
并查集的数据结构记录了一组动态集合
Comments