105. Construct Binary Tree from Preorder and Inorder Traversal
Question: Construct Binary Tree from Preorder and Inorder Traversal
Solution
- preorder: 中 → 左 → 右。第一位永遠是 root
- inorder: 左 → 中 → 右。 找到 root 之,root 之前都是「left subtree」,root 之後都是「right subtree」
-
依據 preorder 的第一位 preorder[0] 得知 root 是誰
-
看 root 在 inorder 中的 index 位置,得知 left subtree & right subtree 分別有哪些
- left subtree = inorder[頭 : root index]
- right subtree = inorder[root index + 1 : 尾]
-
由此推知 preorder 的 left subtree 與 right subtree 位置
- left subtree: inorder 頭到 root index 的長度是 left subtree 的長度,那麼 preorder 由第一位(root)往後算起,加上 left subtree 的長度,就是 preorder 中 left subtree 的位置:preorder[1: left subtree 長度 + 1]
- right subtree: 剩下的數字,也就是 left subtree 之後一直到尾巴:preorder[left subtree 長度 + 1: 尾巴]
-
build_tree function:
subtree 的建立,一樣要回到「 root + left subtree + right subtree 」→ recursive build_tree
-
終止條件:
如果 preorder 或 inorder 是空的,代表走到葉子: if not preorder: return None
-
遞回條件:
如果 preorder 跟 inorder list 裡有東西,就要拿出來做 subtree
- 建立 root
- preorder 第一位: TreeNode(preorder[0])
- 建立 left subtree
- 把 preorder & inorder 的 left subtree 部分找出來,丟回 recursive function: root.left = build_tree(preorder, inorder)
- 建立 right subtree
- 把 preorder & inorder 的 right subtree 部分找出來,丟回 recursive function: root.right = build_tree(preorder, inorder)
# 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]) -> Optional[TreeNode]:
if not preorder:
return None
root = TreeNode(preorder[0])
mid = inorder.index(preorder[0])
root.left = self.buildTree(preorder[1:mid + 1], inorder[: mid])
root.right = self.buildTree(preorder[mid + 1:], inorder[mid + 1:])
return root
Comments
Post a Comment