推导大O阶的方法
- 用常数1取代运行时间中的所有加法常数
- 在修改后的运行次数函数中,只保留最高阶项
- 如果最高阶项存在且不是1,则去除与这个项相乘的常数,结果就是大O阶。
二叉树的性质
- 在二叉树的第i层至多有 2 i − 1 2^{i-1} 2i−1个结点
- 深度为k的二叉树至多有 2 k 2^k 2k - 1个结点
- 对任何一棵二叉树T,如果其终端结点数为 n 0 n_0 n0,度为2的结点数为 n 2 n_2 n2,则 n 0 n_0 n0 = n 2 n_2 n2+ 1
- 具有n个结点的完全二叉树的深度为 ⌊ l o g 2 n ⌋ + 1 \lfloor log_2 n \rfloor+ 1 ⌊log2n⌋+1
- 如果对一棵有n个结点的完全二叉树的结点按层序编号,对任一结点i,有:
如果i = 1,则结点i是二叉树的根,无双亲。如果i > 1,则其双亲是结点 ⌊ i / 2 ⌋ \lfloor i/2 \rfloor ⌊i/2⌋.
如果2i>n,则结点i无左孩子,否则其左孩子是结点2i
如果2i+1>n,则结点i无左孩子;否则其左孩子是结点2i+1
树转换为二叉树
- 加线。在所有兄弟结点之间加一条连线
- 去线。对树中每个结点,只保留它与第一个孩子结点的连线,删除它与其他结点之间的连线
- 层次调整。以树的根结点为轴心,将整棵树顺时针旋转到一定的角度,使之结构层次分明。注意第一个孩子是二叉树的左孩子,兄弟转换过来的孩子是结点的右孩子
森林转换为二叉树
- 把每个树转换为二叉树
- 第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子,用线连接起来。当所有二叉树连接起来后,就得到了由森林转换来的二叉树。
二叉树转换为树
- 加线。若某结点的左孩子结点存在,则该左孩子的右孩子结点都作为此结点的孩子。将该结点与这些右孩子结点用线连接起来。
- 去线。删除原二叉树中所有结点与其右孩子结点的连线。
- 层次调整。
判断一棵二叉树转换为森林还是一棵树
若这棵二叉树的根结点有右孩子,则该二叉树能转换为森林
若这棵二叉树的根结点没有右孩子,则该二叉树能转换为一棵树
二叉树转换为森林
- 从根结点开始,若右孩子存在,则把与右孩子结点的连线删除,再查看分离后的二叉树,若右孩子存在,则连线删除…,直到所有右孩子连线都删除为止,得到分离的二叉树
- 再将每棵分离后的二叉树转换为树即可。
构造哈夫曼树
- 根据给定的n个权值{ w 1 w_1 w1, w 2 w_2 w2,…, w n w_n wn}构成n棵二叉树集合F={ T 1 T_1 T1, T 2 T_2 T2,…, T n T_n Tn},其中每棵二叉树 T i T_i Ti中只有一个带权为 w i w_i wi根结点,其左右子树均为空。
- 再F中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左右子树上根结点的权值之和
- 在F中删除这两棵树,同时将新得到的二叉树加入F中。
- 重复2和3步骤,直到F只含一棵树为止。这棵树就是哈夫曼树、