输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。如输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7],输出: [3,9,20,null,null,15,7]。
前序遍历是指根、左、右的顺序进行遍历,中序是指左、中、右进行遍历。所以前序遍历priorder的第一个节点肯定就是整个二叉树的根节点。根据第一个节点找到该值在inorder的位置,就可以划分出两颗子数。
package leecodeOff;
/*
* 07.重建二叉树
*/
import java.util.HashMap;
import java.util.Map;
public class Demo07_1 {
/*
* preorder = 3,9,20,15,7 前序
* inorder = 9,3,15,20,7 中序
*/
public TreeNode buildTree(int[] preorder, int[] inorder) {
int length = inorder.length;
for(int i=0;i<length;i++) {
map.put(inorder[i], i);
}
return myBuildTree(preorder,inorder,0,length-1,0,length-1);
}
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
public TreeNode myBuildTree(int[] preorder, int[] inorder,int pre_left
,int pre_right,int in_left,int in_right) {
if(pre_left > pre_right) {
return null;
}
int val = preorder[pre_left];
int index = map.get(val);
//左子树的数量
int left_size = index-in_left;
TreeNode root = new TreeNode(val);
TreeNode left = myBuildTree(preorder,inorder,pre_left+1,pre_left+left_size
,in_left,index-1);
TreeNode right = myBuildTree(preorder,inorder,pre_left+left_size+1
,pre_right,index+1,in_right);
root.left =left;
root.right = right;
return root;
}
public static void main(String args[]) {
int[] preorder = {3,9,20,15,7};
int[] inorder = {9,3,15,20,7};
Demo07_1 demo = new Demo07_1();
TreeNode node = demo.buildTree(preorder, inorder);
System.out.println("success");
}
}