题目要求给出前序和中序二叉树遍历结果,重建二叉树。树的节点值不存在冗余。
解法是给出目前处理的前序和中序的起始和结束的index。前序的第一个值为根节点的值,根据这个值在中序中查找index,从而在中序中划分左子树和右子树的遍历,递归求解,直至只有一个节点。注意为了进行中序遍历的高效查找,预先把值存入hashmap之中,python的实现为dict.
class Solution(object): def buildTree(self, preorder, inorder): """ :type preorder: List[int] :type inorder: List[int] :rtype: TreeNode """ if not preorder: return None map ={} length = len(preorder) for i in xrange(length): map[inorder[i]] = i return self.helper(preorder,0,length-1,0,length-1,map) def helper(self,preorder,Pstart,Pend,Istart,Iend,map): if Pstart > Pend: return None node = TreeNode(preorder[Pstart]) if Pstart == Pend: return node i = map[preorder[Pstart]] node.left = self.helper(preorder,Pstart+1,i-Istart+Pstart,Istart,i-1,map) node.right = self.helper(preorder,i-Istart+Pstart+1,Pend,i+1,Iend,map) return node
时间复杂度为O(n),每个结点都需要遍历一遍,递归函数栈的大小为O(logn)。因为建立了dict,最终空间复杂度为O(n),