Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
根据中序遍历和后序遍历构造二叉树~第一回写的代码如下:
class Solution:
# @param inorder, a list of integers
# @param postorder, a list of integers
# @return a tree node
def buildTree(self, inorder, postorder):
if not inorder: return None # inorder is empty
root = TreeNode(postorder[-1])
rootPos = inorder.index(postorder[-1])
root.left = self.buildTree(inorder[ : rootPos], postorder[ : rootPos])
root.right = self.buildTree(inorder[rootPos + 1 : ], postorder[rootPos : -1])
return root
但是一直Memory Limit Exceeded~后参照别人的代码,改进成如下才AC~在找中序遍历的root index时改用了dictionary来查找(而不是直接用list.index()),这种改进把算法的时间复杂度从O(n ^ 2) 提升到O(n)~还有就是注意一下细节~
class Solution:
# @param inorder, a list of integers
# @param postorder, a list of integers
# @return a tree node
def buildTree(self, inorder, postorder):
if inorder is None or postorder is None or len(inorder) == 0 or len(postorder) == 0:
return None
dict = {}
for i in xrange(len(inorder)):
dict[inorder[i]] = i
return self.helper(inorder, postorder, dict, 0, len(inorder) - 1, 0, len(inorder) - 1)
def helper(self, inorder, postorder, dict, inL, inR, postL, postR):
if inL > inR or postL > postR: return None
root = TreeNode(postorder[postR])
index = dict[postorder[postR]]
root.left = self.helper(inorder, postorder, dict, inL, index - 1, postL, postL + index - inL - 1)
root.right = self.helper(inorder, postorder, dict, index + 1, inR, postR - inR + index ,postR - 1)
return root