Binary Tree Storage
二叉树的存储结构
顺序存储
二叉树顺序存储时,必须把二叉树结点编号与完全二叉树的层序编号对应起来。
若编号从 1 开始:
- 结点
i的左孩子编号为2i。 - 结点
i的右孩子编号为2i+1。 - 结点
i的双亲编号为⌊i/2⌋。
顺序存储适合完全二叉树。若普通二叉树也强行按完全二叉树位置存储,需要为缺失结点保留空位,可能造成严重浪费。
若编号从 0 开始:
- 结点
i的左孩子编号为2i+1。 - 结点
i的右孩子编号为2i+2。 - 结点
i的双亲编号为(i-1)/2。
链式存储
二叉树最常用二叉链表:
1 | typedef struct BiTNode { |
含 n 个结点的二叉链表有 2n 个孩子指针域。由于二叉树中实际边数为 n-1,所以空指针域个数为:
$$
2n-(n-1)=n+1
$$
这个结论在线索二叉树中很重要:线索化正是利用这些空指针域保存前驱、后继信息。
三叉链表
若需要频繁访问双亲结点,可增加 parent 指针:
1 | typedef struct TriTNode { |
二叉链表从某结点找孩子很方便,但找双亲只能从根开始遍历;三叉链表用额外空间换取向上访问能力。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Elian's blog page!