SWE · Coding

二叉树右视图:每层最右节点,而非全右链

有的层右子树缺失时,左子树节点仍可见。

题目重点:有的层右子树缺失时,左子树节点仍可见。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 输入有限二叉树,left/right顺序明确,返回从上到下可见节点值。
  • 节点值可以重复,身份仍不同;不把值重复当已访问。

解题路线

  1. BFS每轮固定当前queue长度,先left后right入队,处理完本层最后pop的节点即最右节点。
  2. 不在本轮把新孩子也消费,否则跨层选错。可用右优先DFS记录每深度第一次见到的节点,作为独立验证。
  3. 右视图不等于沿root.right一直走,右链空时可能可见root.left.right等更深节点。树高度极大优先迭代而非递归。

手动走一遍

root1只有left2,2有right3,右视图[1,2,3]。root1左右2/3,则深度1可见3,即使2的值更大也无关。

Python 参考实现

下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。

代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。

from collections import deque
class Node:
    def __init__(self,value,left=None,right=None):self.value=value;self.left=left;self.right=right

def right_view(root):
    if root is None:return []
    queue=deque([root]);answer=[]
    while queue:
        for _ in range(len(queue)):
            node=queue.popleft()
            if node.left is not None:queue.append(node.left)
            if node.right is not None:queue.append(node.right)
        answer.append(node.value)
    return answer

复杂度

O(n)时间/O(w)队列,w最大层宽;输出O(h)。DFS替代O(h)栈。

易错点与追问

容易失分的边界

  • BFS先right后left却仍取最后会得到左视图。
  • 对节点值排序与几何左右顺序无关。

继续深挖

  • 输出节点ID而非值怎样保留身份?
  • 若树允许共享孩子,视图的结构合同需怎样重定义?
✓已复制微信号!