トピック:
トピックリンク: https://leetcode-cn.com/problems/binary-tree-level-order-traversal/
問題解決のアイデア:
方法A:スタック(時間O(N)、スペースO(N))
変数:
- スタック:スタックトラバーサル、初期化、ルートノードのみに
- RES:結果セット
- val_lst:現在の必要性は、結果セットリストに追加します
プロセス:
スタックの初期化、スタックへのルートノード3、次いで横断:
この場合にはval_lstに入れ、第1の素子スタックは、発見された取得し、スタックに左と右のサブツリー3プット
この時点でトラバース開始に横断されたスタック内のすべての要素は、このトラバースのうち、値val_lstはRESに配置されています。
トラバースを続けると、スタック2、2 val_lstの最初の要素を取得し、スタック、スタック2の後、左と右のサブツリーに入れ:
図9は、左と右のサブツリー何がないため、スタック9,9に配置val_lstしていきます、スタック内の要素が追加する必要はありません。
この時点で、これは、val_lst結果セットの解像度に加え、トラバースを継続する次の時間をトラバースに出口を通過するのに必要なすべての要素を横断してきました。
スタックが空になるまで散歩を続行
方法2:DFS(時間O(N)、スペースO(N))
DFS検索、レベルタギングを追加の層を追加するために必要な場合、結果の現在の値を識別
コードの実装:
この方法の一つ:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:
return []
stack = [root]
res = []
while stack:
val_lst = []
for index in range(0, len(stack)):
node = stack[0]
stack.pop(0)
val_lst.append(node.val)
if node.left:
stack.append(node.left)
if node.right:
stack.append(node.right)
res.append(val_lst)
return res
方法2:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
def create_res(res, node, level):
print(res)
if not node:
return res
if len(res) == level:
res.append([])
res[level].append(node.val)
if node.left:
create_res(res, node.left, level + 1)
if node.right:
create_res(res, node.right, level + 1)
return res
return create_res([], root, 0)