титульный
https://leetcode-cn.com/problems/binary-tree-right-side-view
Учитывая двоичное дерево, представьте, что вы стоите справа от него, возвращая значения узлов, которые можно увидеть справа, в порядке сверху вниз.
Пример:
Вход: [1,2,3, ноль, 5, ноль, 4]
Выход: [1, 3, 4]
Объяснение:
1 <---
/
2 3 <---
\
5 4 <---
Идеи решения проблем
- BFS, обход узлов по слою
- Построить многослойный список и сохранить узлы одного слоя в одном и том же списке слева направо
- Возвращая результат, просто возьмите последний из каждого списка слоев
код
# 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 []
# - keep nodes in same level in level_list[level]
level_list = []
# - (node, level)
q = [(root, 1)]
while q:
node,level = q.pop(0)
# - expand level_list for next level
while level > len(level_list):
level_list.append([])
# - append nodes from left to right
level_list[level-1].append(node.val)
level += 1
if node.left: q.append((node.left, level))
if node.right: q.append((node.right, level))
# - return only right most node of each level
return [nodes[-1] for nodes in level_list]
Идеи решения проблем
- На самом деле нет необходимости хранить весь слой узлов, просто продолжайте обновлять последний узел.
код
class Solution:
def rightSideView(self, root: TreeNode) -> List[int]:
if not root: return []
# - level_list[level] is the right most node val at level
level_list = []
# - (node, level)
q = [(root, 1)]
while q:
node,level = q.pop(0)
# - expand level_list for next level
while level > len(level_list):
level_list.append(node.val)
# - append nodes from left to right
level_list[level-1] = node.val
level += 1
if node.left: q.append((node.left, level))
if node.right: q.append((node.right, level))
# - return only right most node of each level
return level_list