Lec04 Tree
一、基本概念¶
(1)树的定义:树是一个n个节点的有限集。¶
- 树的根结点没有前驱,除根结点外的所有结点有且只有一个前驱。
- 树中所有结点可以有零个或多个后继。
- n个节点的树中有n-1条边
(2)基本术语¶
- 度:结点的度为孩子个数;树的度为结点最大度
- 深度:结点的深度为从根结点开始向下累加
- 高度:结点的高度为从叶结点开始向上累加
- 层次:从根结点开始定义,根为第一层;树的深度与高度都为层次的最大值
(3)性质¶
- 树中的结点数等于所有结点的度数加1.
- 度为m的树中第i层上至多有\(m^{i-1}\)个结点(i > = 1)
二、二叉树¶
(1)二叉树的定义:¶
- 每个结点至多只有两棵子树( 即二叉树中不存在度大于2的结点)
- 并且二叉树的子树有左右之分,其次序不能任意颠倒
(2)特殊二叉树¶
- 斜树
- 满二叉树:高度为h,结点数为\(2^h -1\),除叶节点外的每个结点的度数都为2.
约定根节点的编号为1,那么,对于一个有双亲的结点i,它的双亲为i/2,若有左孩,为2i,若有右孩,为2i+1. - 完全二叉树 4. 二叉排序树
(3)二叉树的特殊性质¶
- 非空二叉树上的叶子结点数等于度为2的结点数加1,即\(n_o = n_2 + 1\)
- 非空二叉树上第k层上至多有\(2^{k-1}\)个结点。
- 高度为h的二叉树至多有\(2^h-1\)个结点。
- 对完全二叉树,对每个结点,除了编号的性质,也有层数的性质:编号为i的结点所在的层数为\(log_2 i+1\),那么具有n个结点的完全二叉树的高度为\(log_2 n+1\).
(4)二叉树的储存结构¶
- 顺序储存结构:编号为i的结点存在一维数组下标为i-1的分量中,空的位置用0代替。比较适合 完全二叉树和满二叉树。
- 链式储存结构:每一个结点都含有data,left,right。
typedef struct BiTNode{
TElemType data; //结点数据
struct BiTNode *lchild, *rchild; //左右孩子指针
} BiTNode, *BiTree;
三、遍历二叉树¶
(1)先序遍历¶
(2)中序遍历¶
(3)后序遍历¶
(4)非递归算法¶
void iter_inorder(Tree T)
{
stack s;
while(1)
{
for(;T;T=T.left){
push(T,s);
}
T=top(s);
pop(s);;
if(T=NULL) break;
print(T.data);
T=T.right;
}
}
(5)层次遍历:运用队列¶
(6)由遍历序列构造二叉树¶
- 先序+中序
- 后序+中序
- 层序+中序
四、线索二叉树¶
(1)概念与结构¶
(2)二叉树的线索化¶
实质就是在遍历二叉树的时候修改空指针。也可以通过创造head,让它的lchild指向二叉树的根结点,rchild指向中序遍历访问到的最后一个结点。
五、二叉排序树¶
(1)性质¶
- 若它的左子树不空,则左子树上所有结点的值均小于它根结点的值。
- 若它的右子树不空,则右子树上所有结点的值均大于它根结点的值。
- 它的左、右树又分为⼆叉排序树
(2)作用--中序遍历,可以得到排序¶
(3)查找--对分查找的思想¶
(4)二叉排序树的删除¶
- 删除叶节点
- 删除的根节点,但仅有一个孩子---互换
- 删除的根节点,且有两个孩子---用最左边的最大值/右边的最小值进行替换。
六、树与二叉树的转化¶
七、题目¶
- There exists a binary tree with 2016 nodes in total, and with 16 nodes having only one child.错误