JZ04-根据前序遍历和中序遍历仅从二叉树的重建
描述
给定某二叉树的前序遍历和中序遍历,请重建出该二叉树并返回它的头结点。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}。
提示:
1.0 <= pre.length <= 2000
2.vin.length == pre.length
3.-10000 <= pre[i], vin[i] <= 10000
4.pre 和 vin 均无重复元素
5.vin出现的元素均出现在 pre里
6.只需要返回根结点,系统会自动输出整颗树做答案对比
public static TreeNode reConstructBinaryTree(int [] pre,int [] vin) {
if (pre.length == 0 || vin.length == 0){
return null;
}
TreeNode root = new TreeNode(pre[0]);
TreeNode node = root;
for (int i = 0; i < vin.length; i++) {
if (vin[i] == pre[0]){
root.left = reConstructBinaryTree(Arrays.copyOfRange(pre, 1, i + 1), Arrays.copyOfRange(vin, 0, i));
root.right = reConstructBinaryTree(Arrays.copyOfRange(pre, i + 1, pre.length), Arrays.copyOfRange(vin, i + 1, vin.length));
}
}
return node;
}
其中的主要思路是:
- 找出当前两个遍历的根节点,因为前序遍历的顺序是根左右,中序遍历的顺序是左根右,所以,pre(前序遍历结果)和vin(中序遍历结果)的序列中,我们可以通过找到前序序列中的首个元素,作为根,从而对两边的子树进行划分,例如:在上面的序列中,当前序序列中"1"作为根的时候,可以根据上面判断,即pre{2, 4, 7}、vin{4, 7, 2}分别为该二叉树的左子树。
- 在后续问题中,有一个误区,就是使用递归的时候,会将每一次剩下的序列作为一棵小的二叉树,所以,在上面的后续中,再次将"2"作为根节点的时候,就会将{4, 7}作为该"2"节点的左子树,以此来确定为左还是为右。

浙公网安备 33010602011771号