package LeetCode;
/*
根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
*/
public class BuildTree106 {
public TreeNode buildTree(int[] inorder, int[] postorder) {
return dg(0, inorder.length - 1, 0, postorder.length - 1, inorder, postorder);
}
public TreeNode dg(int is, int ie, int ps, int pe, int[] inorder, int[] postorder) {
if (ps > pe || is > ie) return null;
//后序遍历 最后一个是根节点
TreeNode r = new TreeNode(postorder[pe]);
int mid = -1;
//在中序遍历中找到根节点从而分出来左右子树
for (int i = 0; i < inorder.length; i++) {
if (postorder[pe] == inorder[i]) {
mid = i;
break;
}
}
if (mid == -1) {
return null;
}
;
//因为后续遍历中先左后右最后中所以先请求出右子树的个数
int rightnumber = ie - mid;
r.left = dg(is, mid - 1, ps, pe - rightnumber - 1, inorder, postorder);
r.right = dg(mid + 1, ie, pe - rightnumber, pe-1, inorder, postorder);
return r;
}
public static void main(String[] args) {
BuildTree106 b = new BuildTree106();
int[] a = {9, 3, 15, 20, 7};
int[] c = {9, 15, 7, 20, 3};
b.buildTree(a, c);
}
}