根据一棵树的中序遍历与后序遍历构造二叉树。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTreeChild(int[] inorder, int[] postorder,
int inbegin, int inend) {
if (inbegin > inend) return null;
TreeNode root = new TreeNode(postorder[p]);
int inorderIndex = findInorderIndexOfRoot(inorder,inbegin,inend,postorder[p]);
p--;
//后序和中序要先root.left
root.right = buildTreeChild(inorder,postorder,inorderIndex+1,inend);
root.left = buildTreeChild(inorder,postorder,inbegin,inorderIndex-1);
return root;
}
public int findInorderIndexOfRoot(int[] inorder,int inbegin, int inend,int val) {
for (int i = inbegin; i <= inend; i++) {
if (inorder[i] == val) {
return i;
}
}
return -1;
}
public int p = 0;
public TreeNode buildTree(int[] inorder, int[] postorder) {
if (inorder == null || postorder == null) return null;
if (inorder.length == 0 || postorder.length == 0) return null;
p = postorder.length-1;
return buildTreeChild(inorder,postorder,0,postorder.length-1);
}
}
解题思路:
根据上一篇前序遍历和中序遍历构建二叉树,只需要稍作修改,但是有几个注意的事项:
1.p是从后序遍历的结果数组最后面开始,然后是 p–
2.递归要先右树,再左树,顺序不能反