1. 题目
2. 思路
(1) 递归
- 以前序遍历的第一个元素作为根结点,将中序遍历分成两段,左边是根结点的左子树,右边是根结点的右子树,递归构建左右子树即可。
3. 代码
public class Test {
public static void main(String[] args) {
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
class Solution {
public TreeNode reConstructBinaryTree(int[] pre, int[] vin) {
int n = pre.length;
return build(pre, vin, 0, n - 1, 0, n - 1);
}
public TreeNode build(int[] pre, int[] vin, int left1, int right1, int left2, int right2) {
if (left1 > right1) {
return null;
}
TreeNode root = new TreeNode(pre[left1]);
int mid = left2;
for (int i = left2; i <= right2; i++) {
if (vin[i] == root.val) {
mid = i;
break;
}
}
int leftCount = mid - left2;
root.left = build(pre, vin, left1 + 1, left1 + leftCount, left2, mid - 1);
root.right = build(pre, vin, left1 + leftCount + 1, right1, mid + 1, right2);
return root;
}
}