[LeetCode в Python] 199 (M) двоичное дерево вид справа

титульный

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

рекомендация

отwww.cnblogs.com/journeyonmyway/p/12749348.html
рекомендация