初始化、求根、求双亲、求孩子结点、求右兄弟、建树、插入子树操作、删除子树操作、遍历操作、清除操作。
决策树、二叉排序树、句法依存树······
$$ 2^0 + ……+2^{k-1} = 2^k-1 $$
判断一个树是否是完全二叉树:
思路:从上到下,右到左扫描,第一个度小于 2 的之后的每一个结点都必须是叶子结点。
将任意二叉树修补为完全二叉树,用顺序表对元素进行存储,原二叉树空缺的结点,其顺序表相应单元置空:
结点有三个域:数据域、指向左、右子树的指针域:
思路:
思路:利用队列
双亲表示法:
孩子链法:
孩子兄弟表示法:
将树转换为二叉树:
二叉树转换为树:
森林转换为二叉树:将各棵树分别转换成二叉树,将每棵树的根结点用线相连。
路径:若树中存在某个结点序列 k_1,k_2······k_j。满足 k_i 是 k_{i+1}的双亲,则该结点序列是树上的一条路径。
树的路径长度是指树根到树中每一个结点的路径之和。
完全二叉树的路径长度最短。
结点的权:给树的结点赋以一定意义的数值,称为结点的全权。
结点的带权路径长度:从树根到某个结点的路径长度与该结点的权的积。
树的带权路径长度:树中所有叶子结点的带权路径长度之和。
哈夫曼树的定义:
$$ wpl = \sum_{k=1}^{n}w_kl_k $$
其中,w_k 是第 i 个叶子结点的权值,l_k 是根到第 i 个叶子结点的路径长度。
创建:
初始化 n 个权值,到 forest 的前 n 个单元,作为 forest 中 n 个孤立的根结点。
将前 n 个单元的双亲、左、右孩子指针均置为 0。
不妨将下标为 0 的单元留空。
**前缀码:**任一字符的编码,不能是其他字符的前缀。
原因:没有一片树叶是其他树叶的祖先,所以叶子结点编码不可能是其他叶子结点编码的前缀。