輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。
例如,給出
前序遍歷 preorder = [3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
返回如下的二叉樹:3
/ \
9 20
/ \
15 7
給出的初始代碼爲:
# 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, preorder: List[int], inorder: List[int]) -> TreeNode:
解題思路
利用遞歸的思想
給定preoder和inorder:
- 根節點必爲preorder的第一個元素preorder[0];
- 找到inorder中preorder[0]所在的位置index;
- 那麼,inorder中index之前的index個元素即爲左子樹的中序遍歷;inorder中index之後的(n-index-1)個元素即爲右子樹的中序遍歷;
- 而preorder的第2個~第(index+1)個元素即爲左子樹的前序遍歷;preorder的最後(n-index-1)個元素即爲右子樹的前序遍歷。
- 從而分別得到左子樹和右子樹的preoder和inorder,繼而完成遞歸。
如下圖所示:
代碼如下
# 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, preorder: List[int], inorder: List[int]) -> TreeNode:
if (not preorder): # 空樹
return None
else:
tree = TreeNode(preorder[0]) # 頂點
index = inorder.index(preorder[0]) # 中序遍歷中左右樹的分界點
# index左邊的即爲左子樹的inorder;右邊亦然
left_inorder = inorder[:index]
right_inorder = inorder[index+1:len(inorder)]
# 頂點後的index個數構成的list即爲左子樹的preorder;最後的即爲右子樹的preorder
left_preorder = preorder[1:1+index]
right_preorder = preorder[1+index:len(preorder)]
# 遞歸生成樹
tree.left = self.buildTree(left_preorder,left_inorder)
tree.right = self.buildTree(right_preorder,right_inorder)
return tree
遇到的問題
在初始代碼中,僅根據給出的TreeNode類中的__init__()函數,self.right, self.left都是None。那怎麼給TreeNode賦值呢?
難道要更改class TreeNode中的代碼?
當然是在Solution裏寫啊!比如root = TreeNode(3), 那麼給左子樹和右子樹賦值只需要root.left = XXX; root.right = XXX.即可
還是對Python基礎差對面向對象不熟啊!