完全二叉树
定义:
按层序遍历(从上到下,从左到右)填充节点。
除了最后一层外,其余各层必须全满。
最后一层的节点必须 连续靠左。
完全二叉树不一定是满二叉树。
满二叉树 (Full Binary Tree):每个节点都有 0 或 2 个孩子。
完全二叉树:强调节点填充的顺序,不要求“必须两个孩子”。
我之前在做题的时候就混淆了这两个概念。
完全二叉树的性质
节点数量范围
高度为 h 的完全二叉树(根为第 1 层)
节点数最少:2^(h-1)
节点数最多:2^h - 1
节点位置编号规律(堆存储思想):
如果根节点编号是 1
左孩子 = 2i
右孩子 = 2i + 1
父节节点 = i/2(向下取整)
从0开始父亲节点的下标是(i-1)/2
叶子节点分布
只可能出现在最后一层,或者最后两层。
且最后一层的叶子必须集中在最左边。
数组存储最优
因为节点编号连续 → 可以直接用数组下标表示节点位置(堆就是这样做的)。
节省指针存储空间,也方便随机访问。
注意得到父亲节点的方法
完全二叉树的应用
堆 (Heap)
二叉堆(最大堆、最小堆)就是基于完全二叉树的顺序存储实现的。
优先队列就是堆的典型应用。