import java.util.*;
public class Solution {
public TreeNode reConstructBinaryTree (int[] preOrder, int[] vinOrder) {
if (preOrder.length == 0) {
return null;
}
TreeNode root = new TreeNode(preOrder[0]);
for (int i = 0; i < vinOrder.length; ++i) {
//在中序遍历数组中找第一个前序节点
if (preOrder[0] == vinOrder[i]) {
//Arrays.copyOfRange中的第一个下标是包含的,第二个下标不包含所以加一
root.left = reConstructBinaryTree(Arrays.copyOfRange(preOrder, 1, i+1), Arrays.copyOfRange(vinOrder, 0, i));
root.right = reConstructBinaryTree(Arrays.copyOfRange(preOrder, i + 1, preOrder.length), Arrays.copyOfRange(vinOrder, i + 1, vinOrder.length));
break;
}
}
return root;
}
}
方法:二叉树递归
由于前序遍历是从根开始的,所以每个节点都是后面子树的根,在中序遍历中总能找到该根节点,相应的该节点的左边为左子树、右边为右子树。前序遍历的第二个节点便是中序遍历左子树的根,依次类推通过递归可以建立一个二叉树。
1、空数组返回空树
2、建立一个新结点,在中序遍历的数组中找到前序的第一个节点,新结点的左右指针指向递归的返回节点,递归的参数是截取的原先序数组中属于左子树的部分,和原中序数组中属于左子树的部分,同理右子树也一样。
3、递归结束后跳出循环,返回新结点。
知识点:Arrays中的copyOfRange方法
作用是赋值一个左闭右开的数组,即第二个下标不包含。


京公网安备 11010502036488号