题目:
给定一棵树的前序遍历 preorder 与中序遍历 inorder。请构造二叉树并返回其根节点。
================================================
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]
================================================
Input: preorder = [-1], inorder = [-1]
Output: [-1]
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public static TreeNode buildTree(int[] preorder, int[] inorder) {
//边界判断
if(preorder==null || inorder==null || preorder.length != inorder.length){
return null;
}
HashMap<Integer,Integer> valueHashMap=new HashMap<>();
for(int i=0;i< inorder.length;i++){
valueHashMap.put(inorder[i],i);
}
return setTree(preorder,0,preorder.length-1,inorder,0,inorder.length-1,valueHashMap);
}
//建出整个数,返回头节点,需要传入留个参数,前序的数组,以及起始,终止下标。中序的数组,以及起始终止的下标
public static TreeNode setTree(int[] pre,int L1,int R1,int[] in ,int L2,int R2,HashMap<Integer,Integer> valueHashMap){
if(L1>R1){
return null;
}
//如果长度只有1,直接返回
TreeNode head=new TreeNode(pre[L1]);
if(L1==R1){
return head;
}
int find= valueHashMap.get(pre[L1]);
head.left = setTree(pre,L1+1,L1+find-L2,in,L2,find-1,valueHashMap);
head.right =setTree(pre,L1+find-L2+1,R1,in ,find+1,R2,valueHashMap);
return head;
}
}
======================================================
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public static TreeNode buildTree(int[] preorder, int[] inorder) {
//边界判断
if(preorder==null || inorder==null || preorder.length != inorder.length){
return null;
}
return setTree(preorder,0,preorder.length-1,inorder,0,inorder.length-1);
}
//建出整个数,返回头节点,需要传入留个参数,前序的数组,以及起始,终止下标。中序的数组,以及起始终止的下标
public static TreeNode setTree(int[] pre,int L1,int R1,int[] in ,int L2,int R2){
if(L1>R1){
return null;
}
//如果长度只有1,直接返回
TreeNode head=new TreeNode(pre[L1]);
if(L1==R1){
return head;
}
//寻找中序遍历中,头的位置
int find = L2;
while (in[find]!=pre[L1]){
find++;
}
head.left = setTree(pre,L1+1,L1+find-L2,in,L2,find-1);
head.right =setTree(pre,L1+find-L2+1,R1,in ,find+1,R2);
return head;
}
}