根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
首先定义一个map,key用来存放中序遍历数组中的值,value存放位置
这个图很重要,因为后序遍历最后一个元素一定是根节点,通过这个根节点map里的数值可以找到中序遍历里面根节点位置,根节点左边的就是左子树,右边的就是右子树
然后同时可以通过中序遍历在后序遍历中找到左子树和右子树的位置,也就是通过这两个子树可以再次通过后序遍历规则找到两个子树的根节点,再通过这个根节点可以找到在中序遍历中左子树和右子树的位置,这样就可以进行递归了
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
Map<Integer,Integer> map = new HashMap();
int post[];
public TreeNode buildTree(int[] inorder, int[] postorder) {
post = postorder;
for(int i=0;i<inorder.length;i++){
map.put(inorder[i],i);
}
return reverse(0,inorder.length-1,0,post.length-1);
}
public TreeNode reverse(int ll,int lr,int rl,int rr){
if(ll>lr||rl>rr){
return null;
}
TreeNode tree = new TreeNode(post[rr]);
int zd = map.get(post[rr]);
tree.left = reverse(ll,zd-1,rl,rl+zd-ll-1);
tree.right= reverse(zd+1,lr,rl+zd-ll,rr-1);
return tree;
}
}