题目链接
链接: 从中序与后序遍历序列构造二叉树
题目要求

解题思路
- 先在后序遍历数组中找到根节点
- 根据中序遍历中找到根节点的位置,在中序遍历中分割左子树和右子树
- 再回到后序中找到左子树的后序遍历和右子树的后序遍历
和从前序与中序遍历序列构造二叉树不同的是:
后序遍历的最后一个元素是根节点,因此从后序的最后一个下标向前遍历
从后向前遍历后序,得到的顺序顺序是 根 右 左,也就是镜像的前序遍历
此时就需要 先构建右子树,再构建左子树即可
代码实现
java
class Solution {
//记录 在后序中 遍历到到那个元素
private int index = 0;
private static int findPos(int[] arr, int val, int left ,int right) {
for (int pos = left; pos < right; pos++) {
if (arr[pos] == val) {
return pos;
}
}
return -1;
}
public TreeNode buildTree( int[] inorder,int[] postorder) {
//每次使用需要重置 index 为末尾位置
index = postorder.length - 1;
return buildTreeHelper(inorder,postorder,0,inorder.length);
}
// left 和 right 为了在中序遍历中 ,分隔左子树和右子树的区间
private TreeNode buildTreeHelper( int[] inorder ,int[] postorder, int left, int right) {
//如果是空区间 就说明是空树
if(left == right){
return null;
}
TreeNode root = new TreeNode(postorder[index]);
//指向前一个后序遍历元素
index--;
//在中序中,找到当前根节点的位置
int pos = findPos(inorder, root.val, left, right);
//[pos+1, right) 是右子树区间
root.right = buildTreeHelper(inorder,postorder,pos+1,right);
//[left ,pos) 是左子树区间
root.left = buildTreeHelper(inorder,postorder,left,pos);
return root;
}
}