一、树
1.1 树是一种n(n>=0)个节点的有序集合,在任意非空树中,有且仅有一个根节点。通常,凡是分等级的方案都可以用具有严格层次关系的树结构来描述。
1.2 节点的度:一个节点的子树的个数记为该节点的度。内部节点是度不为0的节点;
1.3 树的高度:一棵树的最大层数记为树的高度。
1.4 有序(无序)树:若树中节点的各个子树看成是从左到右的具有次序的,即不能交换,则该树为有序树,否则称为无序树。
二、二叉树
2.1 二叉树与树之间最主要的区别是:二叉树中节点的子树要区分左子树和右子树,即使在节点只有一棵子树的情况下,也要明确指出该子树是左子树还是右子树,此外,二叉树的度为2。
2.2 二叉树性质
(1)二叉树第i层上最多有
2
i
−
1
2^{i-1}
2i−1个节点;
(2)高度为k的二叉树最多有
2
k
−
1
2^k-1
2k−1个节点(k>=1);
(3)对于任何一颗二叉树,若其终端节点(叶子节点)数为
n
0
n_0
n0,度为2的节点为
n
2
n_2
n2,则
n
0
n_0
n0=
n
2
n_2
n2+1;
(4)具有n个节点的完全二叉树的深度为
l
o
g
2
n
log_2n
log2n下取整加1。
2.3 若深度为k的二叉树有 2 k − 1 2^k-1 2k−1个节点,则称其为满二叉树。
2.4 深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中编号从1至n的节点一一对应时,称之为完全二叉树。
2.5 假设有编号为i的节点:
- 若i = 1,该节点为根节点,无双亲;若i > 1,该节点的双亲节点为 i 2 \frac{i}{2} 2i下取整;
- 若2i <= n,该节点的左孩子编号为2i,否则无左孩子;
- 若2i + 1 <= n,则该节点为右孩子编号为2i+1,否则无右孩子。
2.6 二叉树的三种遍历方法:中序,前序和后序遍历,在递归过程中总是遵循着访问根节点的次数。对含有n个节点的二叉树,遍历的时间复杂度都为O(n),遍历的时候都是将节点入栈,栈的最大长度恰好为树的深度,所以最坏的情况下,n节点的二叉树的深度为n,遍历算法的空间复杂度也为O(n)。
三、线索二叉树
3.1 二叉树的遍历实质上是对一个非线性结构进行线性化的过程,它使得每个节点(除第一个节点和最后一个节点)在这些线性序列中有且仅有一个直接前驱和直接后继。直接前驱和直接后继并不是其父节点和孩子节点,而是前序,中序和后序遍历后序列中表现出来的直接前驱和直接后继。
3.2 若有n节点的二叉树采用二叉链表做存储结构,则链表中必然有n+1个空指针域,可以利用这些空指针域来存放节点的前驱和后继信息。为此,还需要在节点中增加标志ltag和rlag,用来区分孩子指针的指向。
ltag | lchild | data | rchild | rtag |
---|
l t a g = { 0 lchild域指示节点的左孩子 1 , lchild域指示节点的直接前驱 , r t a g = { 0 rchild域指示节点的右孩子 1 , lchild域指示节点的直接后继 ltag= \begin{cases} 0 & \text {lchild域指示节点的左孩子} \\ 1, & \text{lchild域指示节点的直接前驱} \end{cases} , rtag= \begin{cases} 0 & \text {rchild域指示节点的右孩子} \\ 1, & \text{lchild域指示节点的直接后继} \end{cases} ltag={01,lchild域指示节点的左孩子lchild域指示节点的直接前驱,rtag={01,rchild域指示节点的右孩子lchild域指示节点的直接后继
3.3 若二叉树的二叉链表采用以上所示的节点结构,则相应的链表称为线索链表,其中指向节点前驱和节点后继的指针,称之为线索,加上线索的二叉树称为线索二叉树。对二叉树以某种次序遍历使其成为线索二叉树的过程称之为线索化。
3.4 采用这种方式得到的线索二叉树,其线索并不完整,有些节点的前驱和后继需要后续计算才能得到。
四、最优二叉树
4.1 又称为哈夫曼树,它是一类带权路径长度最短的树。
- 路径上的分支数目称之为路径长度,即某条路径是由几个分子路径组成的;
- 树的路径长度是从树根到每一个叶子节点之间的路径长度之和,节点的带权路径长度为该节点到根节点之间路径长度与该节点的权值的乘积。
- 树的带权路径长度为所有叶子节点带权路径长度之和。
4.2 哈弗曼算法
- 根据给定的n个权值{ w 1 , w 2 , . . . , w n w_1,w_2,...,w_n w1,w2,...,wn},构成n棵二叉树的集合F={ T 1 , T 2 , . . . , T n T_1,T_2,...,T_n T1,T2,...,Tn},其中,每棵树 T i T_i Ti中只有一个带权值为 w i w_i wi的根节点,其左右子树均为空。
- 在F中选择两棵权值最小的树作为左,右子树构造一棵新的树,置新构造二叉树的根节点的权值为左,右子树根节点的权值之和。
- 在F中删除这两棵树,同时将新得到的二叉树加入到F中。
- 重复2,3直到F中只有一棵树。
4.3 具有n个叶子节点的权值为 w 1 , w 2 , . . . , w n w_1,w_2,...,w_n w1,w2,...,wn}的最优二叉树并不唯一,因为选择两个子树时并没有指定哪棵作为右子树或左子树。
4.4 当给定n个权值后,构造出的最优二叉树的节点树的节点数目m就确定了,即m = 2n-1,因此可以采用一个一维的结构数组来存储二叉树;
4.5 前缀码:任意编码都不能是另一个编码的前缀,不定长编码。
五、树和森林
5.1 常用的树存储有双亲表示法,孩子表示法和孩子兄弟表示法。
5.2 树的遍历分为两种:先序遍历和中序遍历;