第五章:树
一、树
1.基本概念
树是n(n≥0)个结点的有限集合,n= 0时,称为空树,这是一种特殊情况。
在任意一棵非空树中应满足:
①有且仅有一个特定的称为根的结点。
②当n> 1时,其余结点可分为m(m> 0)个互不相交的有限集合T1, T2,…, Tm,其中每个集合本身又是一棵树,并且称为根结点的子树。
2.基本术语
- 结点之间的关系描述
祖先结点:从一个结点出发,一直往上走,直至根节点,这条路上所有的结点都是该结点的祖先结点。
子孙结点:从一个结点出发,它的所有分支都是该结点的子孙结点。
双亲结点(父节点):一个结点的直接前驱就是双亲结点(父节点)。
孩子结点:一个结点的直接后继就是孩子结点。
兄弟结点:双亲结点(父节点)相同的结点互为兄弟结点。
堂兄弟结点:同一层的不是兄弟结点的结点。
两个结点之间的路径:路径是单向(自上往下)的。
路径长度:经过了几条边。
- 结点、树的属性描述
结点的层次(深度):从上往下数(默认从1开始,但也有些教材是从0开始)
结点的高度:从下往上数
树的高度(深度):总共多少层
结点的度:有几个孩子(分支)
树的度:各结点的度的最大值
- 有序树、无序树
有序树:逻辑上看,树中结点的各子树从左至右是有次序的,不能互换。
无序树:逻辑上看,树中结点的各子树从左至右是无次序的,可以互换。
- 森林
森林:森林是m(m≥0)棵互不相交的树的集合
3.性质
①结点数=总度数+1
结点的度:结点有几个孩子(分支)
②度为m的树、m叉树的区别
树的度:各结点的度的最大值
m叉树:每个结点最多只能有m个孩子的树
度为m的树 | m叉树 |
---|---|
任意结点的度≤m(最多m个孩子) | 任意结点的度≤m(最多m个孩子) |
至少有一个结点度=m(有m个孩子) | 允许所有结点的度都 <m |
一定是非空树,至少有m+1个结点 | 可以是空树 |
③度为m的树第i层至多有m^(i-1)个结点(i≥1);
m叉树第i层至多有m^(i-1)个结点(i≥1)。
④高度为h的m叉树至多有(m^h-1)/(m-1)个结点
⑤高度为h的m叉树至少有h个结点;
高度为h、度为m的树至少有h+m-1个结点。
⑥具有n个结点的m叉树的最小高度为
[ l o g m ( n ( m − 1 ) + 1 ) ] [log_m(n(m-1)+1)] [logm(n(m−1)+1)]
高度最小的情况——所有结点都有m个孩子
二、二叉树
1.定义和基本术语
二叉树是n(n≥0)个结点的有限集合:
① 或者为空二叉树,即n= 0。
② 或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是一棵二叉树。
特点:每个结点至多只有两棵子树;左右子树不能颠倒(二叉树是有序树)
二叉树的五种状态:空二叉树;只有左子树;只有右子树;左右子树都有;只有根结点。
特殊的二叉树:
满二叉树:一棵高度为h,且含有2^h - 1个结点的二叉树
特点:
①只有最后一层有叶子结点
②不存在度为1的结点
③按层序从1开始编号,结点i的左孩子为2i,右孩 子为2i+1;结点i的父节点为𝑖/2(如果有的话)
完全二叉树:当且仅当其每个结点都与高度为h的 满二叉树中编号为1~n的结点一一对应时,称为 完全二叉树
特点:
①只有最后两层可能有叶子结点
②最多只有一个度为1的结点
③按层序从1开始编号,结点i的左孩子为2i,右孩 子为2i+1;结点i的父节点为𝑖/2(如果有的话)
④i≤ 𝑛/2为分支结点,i>𝑛/2为叶子结点
二叉排序树:一棵二叉树或者是空二叉树,或者是具有如下性质的二叉树
左子树上所有结点的关键字均小于根结点的关键字;
右子树上所有结点的关键字均大于根结点的关键字。
左子树和右子树又各是一棵二叉排序树。
平衡二叉树:树上任一结点的左子树和右子树的深度之差不超过1。
平衡二叉树能有更高的搜索效率
2.性质
二叉树:
①设非空二叉树中度为0、1和2的结点个数分别为n0、n1和n2, 则 n0 = n2 + 1
(叶子结点比二分支结点多一个)
②二叉树第i层至多有2^(i-1)个结点(i≥1)
m叉树第i层至多有m^(i-1)个结点(i≥1)
③高度为h的二叉树至多有2^h−1个结点(满二叉树)
高度为h的m叉树至多有(m^h-1)/(m-1)个结点
完全二叉树:
①具有n个(n > 0)结点的完全二叉树的高度h为
[ l o g 2 ( n + 1 ) ] 或 [ l o g 2 n ] + 1 [log_2(n+1)] 或 [log_2n]+1 [log2(n+1)]或[log2n]+1
②对于完全二叉树,可以由的结点数n推出度为0、1和2的结点个数为n0、n1和n2
【突破点:完全二叉树最多只会有一个度为1的结点】
若完全二叉树有2k个(偶数)个结点,则必有n1=1,n0=k,n2=k-1
若完全二叉树有2k-1个(奇数)个结点,则必有n1=0,n0=k,n2=k-1
3.存储结构
3.1 顺序存储
#define MaxSize 100;
struct TreeNode{
int value; //结点的数据元素
bool isEmpty; //结点是否为空
};
TreeNode t[MaxSize];
//定义一个长度为MaxSize的数组t
//按照从上至下、从左至右的顺序依次存储完全二叉树中的各个结点
for(int i=0;i<MaxSize;i++){
t[i].isEmpty = true;
}
//初始化时所有 结点标记为空
3.2 链式存储
typedef struct BiTNode{
int data; //数据域
struct BiTNode *lchild,*rchild; //左、右孩子指针
}BiTNode,*BiTree;
//定义一棵空树
BiTree root = NULL;
//插入根节点
root = (BiTree)malloc(sizzeof