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

假设二叉树采用二叉链表存储结构,设计一个算法求非空二叉树 b 的宽度(结点数最多的一层的结点数)。

[tag_link]

参考答案

逐层 BFS。每轮先记录当前队列长度 levelSize,它就是本层宽度,再处理恰好 levelSize 个结点并将下一层孩子入队。

伪代码

Width(T):
    if T == null: return 0
    Q.enqueue(T); maxWidth = 0
    while not Q.empty():
        levelSize = Q.size()
        maxWidth = max(maxWidth, levelSize)
        repeat levelSize times:
            p = Q.dequeue()
            if p.left  != null: Q.enqueue(p.left)
            if p.right != null: Q.enqueue(p.right)
    return maxWidth

复杂度

时间 O(n);队列最多容纳一层及相邻层的部分结点,空间 O(w),w 为最大宽度。

边界条件

空树返回 0;题设非空时结果至少为 1;不能把空指针计入层宽。

易错点

必须在本层出队前固定 levelSize;若边入队边读取变化后的队长,会把下一层结点混入本层。

评分要点

层序遍历;固定每层结点数;维护 maxWidth;处理空树;复杂度正确。