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

设计一个算法,将二叉树的叶结点按从左到右的顺序连成单链表,表头指针为 head,并用叶结点的 right 指针域保存链表后继。

[tag_link]

参考答案

按先左后右的 DFS 次序遇到叶结点。head 记录首叶,tail 记录末叶;新叶到来时令 tail.right 指向它,结束后令最后一个叶结点的 right 为空。

伪代码

LinkLeaves(T, ref head, ref tail):
    if T == null: return
    if T.left == null and T.right == null:
        if head == null: head = T
        else: tail.right = T
        tail = T
        return
    LinkLeaves(T.left, head, tail)
    LinkLeaves(T.right, head, tail)

head = null; tail = null
LinkLeaves(root, head, tail)
if tail != null: tail.right = null

复杂度

每个结点访问一次,时间 O(n);递归栈空间 O(h),链表复用原指针,不另占结点空间。

边界条件

空树得到 head=null;单结点树中 head=tail=root 且 right=null;最后必须封尾。该做法会改写叶结点的 right 指针。

易错点

必须按左到右遍历;不要在处理完左子树前沿已改写的叶 right 再次递归,也不要忘记保存 tail 和封尾。

评分要点

正确识别叶结点;head/tail 初始化;按先左后右连接;tail.right = T;说明会破坏原树叶结点的 right 域。