【Leetcodeシリーズ] [] [中]アルゴリズムバイナリツリートラバーサルシーケンス(スタック、DFS)

トピック:

トピックリンク:  https://leetcode-cn.com/problems/binary-tree-level-order-traversal/

 

問題解決のアイデア:

方法A:スタック(時間O(N)、スペースO(N))

変数:

  1. スタック:スタックトラバーサル、初期化、ルートノードのみに
  2. RES:結果セット
  3. 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)
                
        

 

公開された100元の記事 ウォンの賞賛4 ビュー1459

おすすめ

転載: blog.csdn.net/songyuwen0808/article/details/105399162