public class Solution {
/**
*@param preorder : A list of integers that preorder traversal of a tree
*@param inorder : A list of integers that inorder traversal of a tree
*@return : Root of a tree
*/
public static int findPosition(int[] inorder,int instart,int inend,int target){
for(int i=instart;i<=inend;i++){
if(inorder[i]==target){
return i;
}
}
return -1;
}
public static TreeNode myBuildTreeHelper(int[] preorder,int prestart,int preend,int[] inorder,int instart,int inend){
if(instart>inend){
return null;
}
TreeNode root = new TreeNode(preorder[prestart]);
int position = findPosition(inorder,instart,inend,preorder[prestart]);
root.left = myBuildTreeHelper(preorder,prestart+1,prestart+position-instart,inorder,instart,position-1);
root.right = myBuildTreeHelper(preorder,prestart+position-instart+1,preend,inorder,position+1,inend);
return root;
}
public TreeNode buildTree(int[] preorder, int[] inorder) {
// write your code here
if(preorder.length!=inorder.length){
return null;
}
return myBuildTreeHelper(preorder,0,preorder.length-1,inorder,0,inorder.length-1);
}
}
扩展:
中序遍历和后序遍历树构造二叉树
public class Solution {
/**
*@param inorder : A list of integers that inorder traversal of a tree
*@param postorder : A list of integers that postorder traversal of a tree
*@return : Root of a tree
*/
public int findPosition(int[] inorder,int instart,int inend,int target){
for(int i=instart;i<=inend;i++){
if(inorder[i]==target){
return i;
}
}
return -1;
}
public TreeNode buildTreeHelper(int[] inorder,int instart,int inend,int[] postorder,int poststart,int postend){
if(instart>inend){
return null;
}
TreeNode root = new TreeNode(postorder[postend]);
int position = findPosition(inorder,instart,inend,postorder[postend]);
root.left = buildTreeHelper(inorder,instart,position-1,postorder,poststart,poststart+position-instart-1);
root.right = buildTreeHelper(inorder,position+1,inend,postorder,poststart+position-instart,postend-1);
return root;
}
public TreeNode buildTree(int[] inorder, int[] postorder) {
// write your code here
if(inorder.length!=postorder.length){
return null;
}
return buildTreeHelper(inorder,0,inorder.length-1,postorder,0,postorder.length-1);
}
}