题目
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
1. 思路
(1)确定根
(2)左右递归建树
——>为了方便递归传参,代码中使用了//arraycopy()方法初始化每次用于构建新子树的两个数组。
arraycopy()方法用于将一个数组的元素快速拷贝到另一个数组。在使用时需要注意避免发生数组越界,即目标数组的空间不足。
//形式:
System.arraycopy(src, srcPos, dest, destPos, length);
//参数介绍:
src --> 源数组
srcPos --> 源数组中拷贝元素的起始位置。
dest --> 目标数组
destPos --> 拷贝到目标数组的起始位置
length --> 被拷贝元素的个数
2. 代码(Java实现)
// 树节点定义
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
TreeNode tree = new TreeNode(pre[0]);
int length = pre.length;
if(length == 1) {
tree.left = tree.right = null;
return tree;
}
else {
int index = 0;
while(index < in.length){
if(in[index] == tree.val) {
//在中序序列中找到根的位置下标index记录下来
break;
}
index++;
}
//递归构建左子树
if(index > 0) {
int [] preleft = new int [index]; //左子树的pre数组
int [] inleft = new int [index]; //左子树的in数组
System.arraycopy(pre, 1, preleft, 0, index);//arraycopy()方法,很方便
System.arraycopy(in, 0, inleft, 0, index);
tree.left = reConstructBinaryTree(preleft, inleft);//递归调用
}else {
tree.left = null; //index = 0,代表左边没节点,左子树空
}
//递归构建右子树
int rlen = length - index - 1;
//怕麻烦,就先用变量代替rlen出来了这个长度,如果不对的话也方便修改,只修改等号右边就可以
if(rlen > 0) {
int [] preright = new int [rlen]; //右子树的pre数组
int [] inright = new int [rlen]; //右子树的in数组
System.arraycopy(pre, index + 1, preright, 0, rlen);
System.arraycopy(in, index + 1, inright, 0, rlen);
reConstructBinaryTree(preright, inright);
tree.right = reConstructBinaryTree(preright, inright);//递归调用
}else {
tree.right = null; //length - index - 1 = 0,代表右边没节点,右子树空
}
return tree;
}
}
}
本文作者:
whtli
本文链接: https://hexo.whtli.cn/archives/bbf8687.html
版权声明: 遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
本文链接: https://hexo.whtli.cn/archives/bbf8687.html
版权声明: 遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。