给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:
1 <—
/
2 3 <—
\
5 4 <—
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-right-side-view
广度优先,即把二次树从上到下一层一层地遍历
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def rightSideView(self, root: TreeNode) -> List[int]:
if not root:
'''判断非空'''
return []
#一层一层的遍历
level = 0 #二叉树的层数
dq = collections.deque() #双端队列
ans = [1] #记录每一层的节点数
pos = [] #返回的List
dq.append(root)
while dq:
ans.append(0) #每一次dq,其第一节点为该层的左边第一节点
while ans[level] != 0:
'''把该层的所有节点pop完'''
v = dq.popleft()
if ans[level] == 1:
# 最右边的节点,入POS
pos.append(v.val)
ans[level] -= 1 #该层节点数减一
'''如果当前节点有孩子,入队,并记录level+1层的节点数'''
if v.left:
dq.append(v.left)
ans[level+1] += 1
if v.right:
dq.append(v.right)
ans[level+1] += 1
level += 1 # 跳到下一层
return pos