首頁 > 軟體

N叉樹的三種遍歷(層次遍歷、前序遍歷、後序遍歷)

2022-04-14 19:01:09

題目連結:

590.N叉樹的後序遍歷

429.N叉樹的層序遍歷

598.N叉樹的前序遍歷

1、層次遍歷

"""
# Definition for a Node.
class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children
"""
 
class Solution:
    def levelOrder(self, root: 'Node') -> List[List[int]]:
        if not root:
            return []
 
        queue = collections.deque()
        queue.append(root)
        res = []
 
        while queue:
            size = len(queue)
            temp = []
            for _ in range(size):
                node = queue.popleft()
                temp.append(node.val)
                if node.children:
                    queue.extend(node.children)
            res.append(temp)
        
        return res

2、前序遍歷

前序遍歷就是從左至右,先根後孩子;遞迴比較簡單,迭代法的話需要藉助一個輔助棧,把每個節點的孩子都壓入棧中;

"""
# Definition for a Node.
class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children
"""
 
class Solution:
    def preorder(self, root: 'Node') -> List[int]:
        if not root:
            return []
        
        #迭代法
        stack, output = [root, ], []            
        while stack:
            root = stack.pop()
            output.append(root.val)
            stack.extend(root.children[::-1])
                
        return output
 
        #遞迴法
        res = []
 
        def helper(root):
            if not root:
                return 
            res.append(root.val)
            for children in root.children:
                helper(children)
        
        helper(root)
 
        return res

3、後序遍歷

在後序遍歷中,我們會先遍歷一個節點的所有子節點,再遍歷這個節點本身。例如當前的節點為 u,它的子節點為 v1, v2, v3 時,那麼後序遍歷的結果為 [children of v1], v1, [children of v2], v2, [children of v3], v3, u,其中 [children of vk] 表示以 vk 為根節點的子樹的後序遍歷結果(不包括 vk 本身)。我們將這個結果反轉,可以得到 u, v3, [children of v3]', v2, [children of v2]', v1, [children of v1]',其中 [a]' 表示 [a] 的反轉。此時我們發現,結果和前序遍歷非常類似,只不過前序遍歷中對子節點的遍歷順序是 v1, v2, v3,而這裡是 v3, v2, v1。

"""
# Definition for a Node.
class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children
"""
 
class Solution:
    def postorder(self, root: 'Node') -> List[int]:
        if not root:
            return []
 
        #後續遍歷是先遍歷一個節點的孩子節點,在去遍歷這個節點本身
        
        #遞迴
        result = []
        def postHelper(root):
            if not root:
                return None
            children = root.children
            for child in children:
                postHelper(child)
            result.append(root.val)
 
        postHelper(root)
        return result
 
 
 
        #迭代法:輔助棧
        res = []
        stack = [root,]
 
        while stack:
            
            node = stack.pop()
            if node is not None:
                res.append(node.val)
            for children in node.children:
                stack.append(children)
        
        return res[::-1]

總結:N叉樹和二元樹的差別不是很多,唯一的差別就是孩子很多不需要去判斷左右孩子了。

到此這篇關於N叉樹的三種遍歷(層次遍歷、前序遍歷、後序遍歷)的文章就介紹到這了,更多相關N叉樹的三種遍歷內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com