106.从中序 从中序与后序遍历序列构造二叉树算法解答
问题链接
leetcode官网原题
开头暴击,不多bb
从中序我们可以知道根节点的左边是leftChild,右边是rightChild,以此为区间扩展自己的小弟,构造节点进行返回。
后序遍历可以告诉我们什么呢?首先,后序遍历原数组的最后一个节点肯定是根节点,比如[1,4,7,9],9肯定是根节点,如果9已经被构造了,数组变成了[1,4,7],这时候怎么解决?根据后序遍历的原顺序是 '左、右、中',变成数组的时候必定是逆序的,中节点已经用了,只剩下右节点和左节点,这时候先构造右节点,再构造左节点就完成了逆序。
再来一次暴击,直接上代码
class Solution {
Map<Integer, Integer> inOrderIndexMap = new HashMap<>();
int postIndex;
public TreeNode buildTree(int[] inorder, int[] postorder) {
for (int i = 0; i < inorder.length; i++){
inOrderIndexMap.put(inorder[i], i);
}
postIndex = postorder.length - 1;
return constructTree(inorder, postorder, 0, inorder.length - 1);
}
public TreeNode constructTree(int[] inorder, int[] postorder, int preIn, int endIn){
if (preIn > endIn){
return null;
}
int rootNum = postorder[postIndex--];
int rootIndex = inOrderIndexMap.get(rootNum);
TreeNode root = new TreeNode(rootNum);
root.right = constructTree(inorder, postorder, rootIndex + 1, endIn);
root.left = constructTree(inorder, postorder, preIn, rootIndex - 1);
return root;
}
}