题目:
给定一棵树的前序遍历 preorder 与中序遍历 inorder。请构造二叉树并返回其根节点。
示例:
Input:
preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output:
[3,9,20,null,null,15,7]
思路:
递归,先考虑特殊情况,整体思路是
先由前序遍历找到根节点,再找到根节点在中序遍历序列中的索引位置,这样把前序遍历和中序遍历序列都分成两部分进行递归,所以根节点的左子树就是调用原函数,参数就是前序和中序遍历序列,前序遍历索引是从1开始,就是根节点后面的节点开始,一直到中间位置,中序遍历索引就是从开始一直到中间位置,根节点的右子树也调用原函数,其中前序和中序遍历的索引就是从中间开始往后,最后返回根节点,得到构造的二叉树。
找根节点在中序遍历序列中的索引的步骤,如果直接索引会有更高的时间复杂度,可以先由中序遍历序列构造一个哈希表,再从哈希表中找索引,但是这样会提高空间复杂度,而且实际运行时,使用哈希表的时间和空间复杂度都比直接搞要高。
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def buildTree(self, preorder, inorder):
"""
:type preorder: List[int]
:type inorder: List[int]
:rtype: TreeNode
"""
# 占用了更多的空间,但是时间没有减少啊啊
if not preorder:
return None
index = {element:i for i,element in enumerate(inorder)}
root = TreeNode(preorder[0])
mididx = index[preorder[0]]
root.left = self.buildTree(preorder[1:mididx+1],inorder[:mididx])
root.right = self.buildTree(preorder[mididx+1:],inorder[mididx+1:])
return root
# if not preorder:
# return None
# # index = {element:i for i,element in enumerate(inorder)}
# root = TreeNode(preorder[0])
# mididx = inorder.index(preorder[0])
# root.left = self.buildTree(preorder[1:mididx+1],inorder[:mididx])
# root.right = self.buildTree(preorder[mididx+1:],inorder[mididx+1:])
# return root