Leetcode 105:從前序與中序遍歷序列構造二叉樹(最詳細的解法!!!)
阿新 • • 發佈:2018-12-17
根據一棵樹的前序遍歷與中序遍歷構造二叉樹。
注意: 你可以假設樹中沒有重複的元素。
例如,給出
前序遍歷 preorder = [3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
返回如下的二叉樹:
3
/ \
9 20
/ \
15 7
解題思路
這是一個非常基礎的問題。我們考慮這樣一個簡單的例子
preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]
我們知道preorder[0]
就是二分搜尋樹的root
,而且在inorder
中3
的左邊是左子樹,而3
的右邊是右子樹。接著用同樣的方法找到左右子樹的root
class Solution:
def buildTree(self, preorder, inorder):
"""
:type preorder: List[int]
:type inorder: List[int]
:rtype: TreeNode
"""
return self._buildTree(0, len(preorder)-1, 0, len(inorder)-1, preorder, inorder)
def _buildTree(self, pre_start, pre_end, in_start, in_end, preorder, inorder):
if pre_start > pre_end or in_start > in_end:
return
root = TreeNode(preorder[pre_start])
ini, i = 0, in_start
while i <= in_end:
if inorder[i] == root.val:
ini = i
i += 1
root.left = self._buildTree(pre_start+1, pre_end, in_start, ini-1, preorder, inorder)
root.right = self._buildTree(pre_start+ini-in_start+1, pre_end, ini+1, in_end, preorder, inorder)
return root
同樣對於遞迴可以解決的問題,我們都希望可以通過迭代去解決。
class Solution:
def buildTree(self, preorder, inorder):
"""
:type preorder: List[int]
:type inorder: List[int]
:rtype: TreeNode
"""
if not inorder or not preorder:
return
root = TreeNode(preorder[0])
stack = [root]
i = 0
for node in preorder[1:]:
parent = stack[-1]
if parent.val != inorder[i]:
parent.left = TreeNode(node)
stack.append(parent.left)
else:
while stack and stack[-1].val == inorder[i]:
parent = stack.pop()
i += 1
parent.right = TreeNode(node)
stack.append(parent.right)
return root
reference:
如有問題,希望大家指出!!!