LeetCode #105. Construct Binary Tree from Preorder and Inorder Traversal
题目
105. Construct Binary Tree from Preorder and Inorder Traversal
解题思路
先序遍历中的第一个位置就是整个树的根,在中序遍历中找到这个根的位置后可以把它分为左右两个部分,分别对两个部分再进行递归即可。
如果采用字典的方法代替index方法,可以将时间复杂度从O(n^2)降低到O(n)。
代码
不使用字典
class Solution:
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
if inorder:
ind = inorder.index(preorder.pop(0))
root = TreeNode(inorder[ind])
root.left = self.buildTree(preorder, inorder[0:ind])
root.right = self.buildTree(preorder, inorder[ind+1:])
return root
使用字典
class Solution:
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
map_inorder = {}
for i, val in enumerate(inorder):
map_inorder[val] = i
def recur(low, high):
if low > high:
return None
x = TreeNode(preorder.pop(0))
mid = map_inorder[x.val]
x.left = recur(low, mid - 1)
x.right = recur(mid + 1, high)
return x
return recur(0, len(inorder) - 1)