前序遍历顺序 根节点 左子树 右子树 中序遍历 左子树 根节点 右子树 后序遍历 左子树
右子树 根节点这道题和从前序与中序遍历序列构造二叉树,只是 root.right=helper(mid+1,right);
root.left=helper(left,mid);
顺序发生改变 仍然是使用全局变量post_index,
从后往前 创建结点
class Solution {
int post_index;
int[] inorder;
int[] postorder;
Map<Integer,Integer> map=new HashMap<>();
public TreeNode buildTree(int[] inorder, int[] postorder) {
this.inorder=inorder;
this.postorder=postorder;
this.post_index=postorder.length-1;
int in_index=0;
for(int num:inorder){
map.put(num,in_index++);
}
return helper(0,inorder.length);
}
public TreeNode helper(int left,int right){
//遍历完成,则返回
if(left==right)return null;
//获取当前根节点
int val=postorder[post_index];
//获取中序遍历分叉点
int mid=map.get(val);
//往前遍历
post_index--;
//创建结点
TreeNode root=new TreeNode(val);
//分治 递归
root.right=helper(mid+1,right);
root.left=helper(left,mid);
return root;
}
}