标签:
题目要求给出前序和中序二叉树遍历结果,重建二叉树。树的节点值不存在冗余。
解法是给出目前处理的前序和中序的起始和结束的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),
Construct Binary Tree from Preorder and Inorder Traversal
标签:
原文地址:http://www.cnblogs.com/sherylwang/p/5405686.html