题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems
特别鸣谢:来自夸夸群的 醉笑陪公看落花@知乎,王不懂不懂@知乎,QFIUNE@csdn
感谢醉笑陪公看落花@知乎 倾囊相授,感谢小伙伴们督促学习,一起进步
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
输入: [1,2,3,null,5,null,4]
输出: [1,3,4]
输入: [1,null,3]
输出: [1,3]
来源:https://leetcode-cn.com/problems/binary-tree-right-side-view/
题目分析
只要先把树每一层的最右侧节点和层数记录下来,即可得到右视图,可以用深度遍历和层次遍历实现
RLH 遍历(先序遍历的倒序)
这样可以保证每一层最靠近右边的节点被记录下来,用字典来控制每一层节点是否被记录
class Solution:
def rightSideView(self, root: TreeNode) -> list[int]:
memor = {}
def RLH(root,h):
if not root:return root
RLH(root.right,h+1)
RLH(root.left,h+1)
if h not in memor:memor[h] = root.val
RLH(root,0)
return [memor[x] for x in sorted(memor.keys())]
层次遍历 layer
class Solution:
def rightSideView(self, root: TreeNode) -> List[int]:
ans = []
if root == None:return []
def layer(root):
qs = [root]
while len(qs)>0:
ans.append(qs[-1].val)
child = []
for q in qs:
if q.left:child.append(q.left)
if q.right:child.append(q.right)
qs = child
layer(root)
return ans
初始化用例节点
题目给出的是一个列表,不好调试,这里给出生成树的代码
[1,2,3,null,5,null,4] ==》 root
# Definition for a binary tree node.
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def bfs(btree,i):
if i >= len(btree):return None
if btree[i] == None:return None
root = TreeNode(btree[i])
root.left = bfs(btree, 2*i+1)
root.right = bfs(btree, 2 * i + 2)
return root
btree = [1,2,3,None,5,None,4]
root = bfs(btree,0)