题目传送:https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
运行效率
代码如下:
class Solution {
public TreeNode buildTree(int[] inorder, int[] postorder) {
// 后序序列的最后一个元素就是根节点
int val = postorder[postorder.length - 1];
TreeNode root = new TreeNode(val);
// 找到根节点在中序序列中的位置
int index = findIndex(inorder, val);
// 然后根据这个位置,把中序序列切割成2个部分
// 左子树的节点个数
int leftChildLength = index;
// 右子树的节点个数
int rightChildLength = inorder.length - index - 1;
if (leftChildLength > 0) {
// 中序序列中 关于左子树的部分
int[] inOrderFisrtArray = Arrays.copyOfRange(inorder, 0, index);
// 后序序列中 关于左子树的部分
int[] postOrderFisrtArray = Arrays.copyOfRange(postorder, 0, leftChildLength);
TreeNode leftChild = buildTree(inOrderFisrtArray, postOrderFisrtArray);
root.left = leftChild;
}
if (rightChildLength > 0) {
// 中序序列中 关于右子树的部分
int[] inOrderSecondArray = Arrays.copyOfRange(inorder, index + 1, inorder.length);
// 后序序列中 关于右子树的部分
int[] postOrderSecondArray =
Arrays.copyOfRange(postorder, leftChildLength , postorder.length-1);
TreeNode rightChild = buildTree(inOrderSecondArray, postOrderSecondArray);
root.right = rightChild;
}
return root;
}
public int findIndex(int[] inorder, int val) {
for (int i = 0; i < inorder.length; i++) {
if (inorder[i] == val) {
return i;
}
}
return -1;
}
}