题目:
给定两个整数数组inorder和postorder ,其中inorder是二叉树的中序遍历,postorder是同一棵树的后序遍历,请构造并返回这颗二叉树
示例:
输入:inorder = [9, 3, 15, 20, 7], postorder = [9, 15, 7, 20, 3]
输出:[3, 9, 20, null, null, 15, 7]
示例:
输入:inorder = [-1], postorder = [-1]
输出:[-1]
代码:
public TreeNode<Integer> buildTree(int[] inorder, int[] postorder) {if (inorder == null || postorder == null || inorder.length == 0 || postorder.length == 0) {return null;}TreeNode<Integer> node = new TreeNode<>(postorder[postorder.length - 1]);int index = -1;int index2 = -1;for (int x = 0; x < inorder.length; x++) {//后序特点是 根在最后,中序特点是根左边是左子树,根右边是右子树//获取后序数组中最后一位值,在中序数组中找出值的位置,并记录index//获取在中序中index+1在的值,找出这个值在后序中的位置并记录 index2//最后切割两个数组.if (postorder[postorder.length - 1] == inorder[x]) {index = x;int[] leftI = null;int[] rightI = null;int[] leftP = null;int[] rightP = null;for (int y = 0; y < postorder.length; y++) {int temp = -1;if (index + 1 < inorder.length) {temp = index + 1;} else if (index + 1 == inorder.length) {temp = index;}if (inorder[temp] == postorder[y]) {index2 = y;leftI = Arrays.copyOfRange(inorder, 0, index);rightI = Arrays.copyOfRange(inorder, index + 1, inorder.length);leftP = Arrays.copyOfRange(postorder, 0, index2);rightP = Arrays.copyOfRange(postorder, index2, postorder.length - 1);break;}}node.lTreeNode = buildTree(leftI, leftP);node.rTreeNode = buildTree(rightI, rightP);}}return node;}
