1. 程式人生 > 其它 >【Leetcode】105: 從前序與中序遍歷序列構造二叉樹

【Leetcode】105: 從前序與中序遍歷序列構造二叉樹

這題目是有一個常見的套路的,由於先序遍歷的結果list都會遵循這樣的一個排列方式,也就是第一個是root,後面的分別是左子樹的node的集合,以及右子樹的node的集合。

[ 根節點, [左子樹的前序遍歷結果], [右子樹的前序遍歷結果] ]

而inorder中序遍歷的結果則是:

[ [左子樹的中序遍歷結果], 根節點, [右子樹的中序遍歷結果] ]

畫成下圖就可以表示為:

我們通過preorder拿到root的地址之後,就可以找到root在inorder當中的位置。然後拿到preorder和inorder當中的左子樹和右子樹,這樣就可以對root.left以及root.right進行遞迴,build出一棵完整的二叉樹。

程式碼如下:

# 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 buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        
if not preorder or not inorder: # 遞迴終止條件 return root = TreeNode(preorder[0]) idx = inorder.index(preorder[0]) root.left = self.buildTree(preorder[1:1 + idx], inorder[:idx]) root.right = self.buildTree(preorder[1 + idx:], inorder[idx + 1:])
return root