Given inorder and postorder/preorder and inorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
思路:用递归的思想,inorder是先左,中,右,而postorder是左,右, 中。因而每次递归返回当前子树的root,root就是postorder的最后一个,然后再寻找当前子树的左子树和右子树的根作为root的左右child,在此过程中寻找inorder list和postorder list中对应的左子树和右子树。
如果是preorder和inorder, 思路完全一样,注意递归时候参数的传递
inorder and postorder:
# Definition for a binary tree node
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# @param inorder, a list of integers
# @param postorder, a list of integers
# @return a tree node
def createTree(self, inorder, postorder, li, ri, lp, rp):
if li > ri or lp > rp:
return None
else:
root = TreeNode(postorder[rp])
i = li
while inorder[i] != postorder[rp]:
i += 1
root.left = self.createTree(inorder, postorder, li, i-1, lp, lp+i-1-li)
root.right = self.createTree(inorder, postorder, i+1, ri, lp+i-li, rp-1)
return root
def buildTree(self, inorder, postorder):
return self.createTree(inorder, postorder, 0, len(inorder) - 1, 0, len(postorder) - 1)
preorder and inorder:
# Definition for a binary tree node
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# @param preorder, a list of integers
# @param inorder, a list of integers
# @return a tree node
def createTree(self, preorder, inorder, lp, rp, li, ri):
if lp > rp or li > ri:
return None
else:
root = TreeNode(preorder[lp])
i = li
while inorder[i] != preorder[lp]:
i += 1
root.left = self.createTree(preorder, inorder, lp+1, lp+i-1-li+1, li, i-1)
root.right = self.createTree(preorder, inorder, lp+i-1-li+2, rp, i+1, ri)
return root
def buildTree(self, preorder, inorder):
return self.createTree(preorder, inorder, 0, len(preorder)-1, 0, len(inorder)-1)