给定两个整数数组 inorder
和 postorder
,其中 inorder
是二叉树的中序遍历, postorder
是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
思路:
- 中序遍历数组中,找到一个根节点,那么其前为其左子树,其后为其右子树
- 后序遍历数组从后像前依次为 根节点-右-左
- 根据后序数组得到根节点,通过map(保存inorder数据及下标,以便返回根节点在inorder中的位置,从而区分左右子树,以便再次进行递归)找到inorder中的根节点位置,将其值加入到root中。
class Solution{
int post_idx;
int[] inorder;
int[] postorder;
Map<Integer, Integer> map = new HashMap<>();
public TreeNode buildTree(int[] inorder, int[] postorder){
this.inorder = inorder;
this.postorder = postorder;
post_idx = postorder.length - 1;
int idx = 0;
// 将中序数组传进map中
for(int val : inorder){
map.put(val, idx++);
}
return helper(0, post_idx);
}
public TreeNode helper(int l, int r){
if(l > r) return null;
int root_val = postorder[post_idx--];
// 没有post_idx--,报错了StackOverflowError
TreeNode root = new TreeNode(root_val);
int idx = map.get(root_val);
root.right = helper(idx + 1, r);
root.left = helper(l, idx - 1);
return root;
}
}