课后题 数据结构 ds.05.03.01 解答题
第 65 题

二叉树按二叉链表形式存储,试编写一个判别给定二叉树是否为完全二叉树的算法。

[tag_link]

参考答案

层序扫描时把左右空指针也入队。一旦遇到第一个空位置,后续队列中若再出现非空结点,就说明层序编号出现空洞,该树不是完全二叉树。

伪代码

IsComplete(T):
    if T == null: return true
    Q.enqueue(T); seenNull = false
    while not Q.empty():
        p = Q.dequeue()
        if p == null:
            seenNull = true
        else:
            if seenNull: return false
            Q.enqueue(p.left)      // 空指针也入队
            Q.enqueue(p.right)
    return true

复杂度

每个真实结点及其边界空指针至多处理一次,时间 O(n),队列空间 O(n),通常记为 O(w)。

边界条件

空树通常视为完全二叉树;单结点树成立;只有左孩子成立,只有右孩子不成立。

易错点

只把非空孩子入队会丢失空位信息,从而把“右边仍有结点”的非法结构误判为完全。

评分要点

采用层序;空指针入队;首空后拒绝非空;覆盖空树和单侧孩子。