这道题目一定要理解,经常会遇到
根据一棵树的前序遍历与中序遍历构造二叉树。
示例
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private int[]preorder_copy;
private int[]inorder_copy;
private int index=0;
public TreeNode buildTree(int[] preorder, int[] inorder) {
preorder_copy=preorder;
inorder_copy=inorder;
HashMap<Integer,Integer>map=new HashMap<>();
for(int i=0;i<inorder.length;i++){map.put(inorder[i],i);}
return JiSuan(0,inorder.length-1,map);
}
public TreeNode JiSuan(int left,int right,HashMap<Integer,Integer>map){
if(left>right){return null;}
//按照前序遍历的顺序从头开始建立节点
TreeNode node=new TreeNode(preorder_copy[index]);
//key为preorder_copy[index]在中序遍历中的位置
//因此node节点的left对应中序遍历left到key-1
//node节点的right对应中序遍历的key+1到right
int key=map.get(preorder_copy[index]);
index++;
node.left=JiSuan(left,key-1,map);
node.right=JiSuan(key+1,right,map);
return node;
}
}