标题:106从中序与后序遍历序列构造二叉树-中等
题目
示例1
输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]
示例2
输入:inorder = [-1], postorder = [-1]
输出:[-1]
提示
- 1 <= inorder.length <= 3000
- postorder.length == inorder.length
- -3000 <= inorder[i], postorder[i] <= 3000
- inorder 和 postorder 都由 不同 的值组成
- postorder 中每一个值都在 inorder 中
- inorder 保证是树的中序遍历
- postorder 保证是树的后序遍历
代码Java
public TreeNode buildTree(int[] inorder, int[] postorder) {
if (postorder.length == 0) return null;
int endval = postorder[postorder.length - 1];
TreeNode root = new TreeNode(endval);
int mid = -1;
for (int i = 0; i < inorder.length; i++) {
if (inorder[i] == endval) {
mid = i;
break;
}
}
int[] inLeft = Arrays.copyOfRange(inorder, 0, mid);
int[] inRight = Arrays.copyOfRange(inorder, mid + 1, inorder.length);
int[] postLeft = Arrays.copyOfRange(postorder, 0, inLeft.length);
int[] postRight = Arrays.copyOfRange(postorder, postLeft.length, postorder.length - 1);
root.left = buildTree(inLeft, postLeft);
root.right = buildTree(inRight, postRight);
return root;
}
public TreeNode buildTree1(int[] inorder, int[] postorder) {
return build(inorder, 0, inorder.length, postorder, 0, postorder.length);
}
public TreeNode build(int[] inorder, int inLeft, int inRight, int[] postorder, int postLeft, int postRight) {
if (postRight - postLeft < 1) {
return null;
}
if (inRight - inLeft == 1) {
return new TreeNode(inorder[inLeft]);
}
int endval = postorder[postRight - 1];
TreeNode root = new TreeNode(endval);
int mid = -1;
for (int i = inLeft; i < inRight; i++) {
if (inorder[i] == endval) {
mid = i;
break;
}
}
root.left = build(inorder, inLeft, mid,
postorder, postLeft, postLeft + mid - inLeft);
root.right = build(inorder, mid + 1, inRight,
postorder, postLeft + mid - inLeft, postRight - 1);
return root;
}