problem
Given preorder and inorder traversal of a tree, construct the binary
tree.Note: You may assume that duplicates do not exist in the tree.
solution
根据前序遍历和中序遍历的定义我们可以知道前序遍历的第一个元素一定是根节点,而在中序遍历中根节点的左边是左子树的中序遍历,右边是右子树的中序遍历。
利用此条规则我们可以写出递归的代码还原树。
class Solution(object):
def buildTree(self, preorder, inorder):
"""
:type preorder: List[int]
:type inorder: List[int]
:rtype: TreeNode
"""
if not preorder:
return None
root = TreeNode(preorder[0])
i = inorder.index(preorder[0])
# print(preorder[1:i], inorder[:i])
root.left = self.buildTree(preorder[1:i+1], inorder[:i])
# print(preorder[i:], inorder[i+1:])
root.right = self.buildTree(preorder[i+1:], inorder[i+1:])
return root
改进
可以看到上述代码的额外消耗主要集中在中序遍历查找根节点的位置上,而元素都是不重复的,所以我们可以使用hash表存储下来对应的位置,和offset的大小,即可使用 O(1) 的时间寻找对应的位置,整体的时间复杂度为 O(n)