LeetCode 熱題 100 | 105. 從前序與中序遍歷序列構造二叉樹
大家好,今天我們來解決一道經典的二叉樹問題——從前序與中序遍歷序列構造二叉樹。這道題在 LeetCode 上被標記為中等難度,要求根據給定的前序遍歷和中序遍歷序列,構造并返回二叉樹的根節點。
問題描述
給定兩個整數數組 preorder
和 inorder
,其中 preorder
是二叉樹的先序遍歷,inorder
是同一棵樹的中序遍歷,請構造二叉樹并返回其根節點。
示例 1:
輸入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
輸出: [3,9,20,null,null,15,7]
示例 2:
輸入: preorder = [-1], inorder = [-1]
輸出: [-1]
提示:
1 <= preorder.length <= 3000
inorder.length == preorder.length
-3000 <= preorder[i], inorder[i] <= 3000
preorder
和inorder
均無重復元素inorder
均出現在preorder
preorder
保證為二叉樹的前序遍歷序列inorder
保證為二叉樹的中序遍歷序列
解題思路
核心思想
-
前序遍歷:
- 前序遍歷的第一個元素是根節點。
- 使用前序遍歷的第一個元素在中序遍歷中找到根節點的位置,從而將中序遍歷分為左子樹和右子樹。
-
遞歸構造:
- 遞歸地構造左子樹和右子樹。
Python代碼實現
class Solution:def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:if not preorder or not inorder:return None# 前序遍歷的第一個元素是根節點root_val = preorder[0]root = TreeNode(root_val)# 在中序遍歷中找到根節點的位置mid_idx = inorder.index(root_val)# 遞歸構造左子樹和右子樹root.left = self.buildTree(preorder[1:mid_idx + 1], inorder[:mid_idx])root.right = self.buildTree(preorder[mid_idx + 1:], inorder[mid_idx + 1:])return root
代碼解析
-
基本情況:
- 如果
preorder
或inorder
為空,直接返回None
。
- 如果
-
構造根節點:
- 使用
preorder
的第一個元素作為根節點的值。
- 使用
-
找到根節點在中序遍歷中的位置:
- 使用
inorder.index(root_val)
找到根節點在中序遍歷中的位置。
- 使用
-
遞歸構造左子樹和右子樹:
- 使用中序遍歷的分割點,遞歸地構造左子樹和右子樹。
-
返回根節點:
- 返回構造好的根節點。
復雜度分析
- 時間復雜度:O(n),其中
n
是樹中節點的數量。每個節點被訪問一次。 - 空間復雜度:O(n),遞歸調用棧的深度最多為樹的高度。
示例運行
示例 1
輸入:preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
輸出:[3,9,20,null,null,15,7]
示例 2
輸入:preorder = [-1], inorder = [-1]
輸出:[-1]
總結
通過遞歸方法,我們可以高效地從前序和中序遍歷序列構造二叉樹。遞歸地找到根節點在中序遍歷中的位置,從而將中序遍歷分為左子樹和右子樹。希望這篇題解對大家有所幫助,如果有任何問題,歡迎在評論區留言討論!
關注我,獲取更多算法題解和編程技巧!