🐙

NeetCode 150 [Trees]medium:Binary Tree Level Order Traversal

に公開

NeetCodeのSolutionを書いていく

Binary Tree Level Order Traversal

問題

2分木のルートが与えられます。
階層順にネストしたリストとして返しなさい。
各リストは左から右の順番に格納します。

Input: root = [1,2,3,4,5,6,7]
Output: [[1],[2,3],[4,5,6,7]]

Input: root = [1]
Output: [[1]]

Input: root = []
Output: []

制約

  • 0 <= The number of nodes in both trees <= 1000.
  • -1000 <= Node.val <= 1000

計算量:O(n)
メモリ:O(n)

メモ

どうやって配列から2分木を決定するんだろう。完全2分木なのか?
特にあたって問題文に記載がない条件が出てきた。
Noneは有効なデータであって、そこの枝はないという意味らしい。
これってすごく大事な説明なんじゃ・・・?

解き方としてはrootから処理を開始して、レベルごとに値を配列に格納していけばいいらしい。
言葉にするとそのままなんだけど、それをどうやるかということで。
レベルごとに、次のレベルをキューに詰めながら処理をすると良いらしい。

import collections
from typing import List, Optional


# 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


class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        res = []

        q = collections.deque()
        q.append(root)

        while q:
            qLen = len(q)
            level = []
            for i in range(qLen):
                node = q.popleft()
                if node:
                    level.append(node.val)
                    q.append(node.left)
                    q.append(node.right)
            if level:
                res.append(level)

        return res

Discussion