LeetCode 0106. Construct Binary Tree from Inorder and Postorder Traversal從中序與後序遍歷序列構造二叉樹【Medium】【Python】【二叉樹】【遞歸】
Problem
Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
For example, given
inorder = [9,3,15,20,7]
postorder = [9,15,7,20,3]
Return the following binary tree:
3
/ \
9 20
/ \
15 7
問題
根據一棵樹的中序遍歷與後序遍歷構造二叉樹。
注意:
你可以假設樹中沒有重複的元素。
例如,給出
中序遍歷 inorder = [9,3,15,20,7]
後序遍歷 postorder = [9,15,7,20,3]
返回如下的二叉樹:
3
/ \
9 20
/ \
15 7
思路
遞歸
中序遍歷:左根右
後序遍歷:左右根
於是,每次取後序遍歷末尾的值,表示根,再到中序遍歷中確定索引。
再根據索引,分割成左子樹和右子樹。如此遞歸。
注意:
保證遞歸的 inorder 和 postorder 個數一致。
時間複雜度: O(n),n 爲節點個數。
空間複雜度: O(n),n 爲節點個數。
Python3代碼
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
if not postorder:
return None
root = TreeNode(postorder[-1])
# 根在中序遍歷中的索引
i = inorder.index(root.val)
# left: inorder[0] ~ inorder[i-1], postorder[0] ~ postorder[i-1]
root.left = self.buildTree(inorder[:i], postorder[:i])
# right: inorder[i+1] ~ inorder[-1], postorder[i] ~ postorder[-2]
root.right = self.buildTree(inorder[i+1:], postorder[i:-1])
return root