题目重点:有的层右子树缺失时,左子树节点仍可见。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 输入有限二叉树,left/right顺序明确,返回从上到下可见节点值。
- 节点值可以重复,身份仍不同;不把值重复当已访问。
解题路线
- BFS每轮固定当前queue长度,先left后right入队,处理完本层最后pop的节点即最右节点。
- 不在本轮把新孩子也消费,否则跨层选错。可用右优先DFS记录每深度第一次见到的节点,作为独立验证。
- 右视图不等于沿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而非值怎样保留身份?
- 若树允许共享孩子,视图的结构合同需怎样重定义?
