版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/AustinBoris/article/details/79844392
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
要求
时间限制:1秒 空间限制:32768K
参数类型
//二叉树节点
public class TreeNode {
int val;
TreeNode left;//左子树
TreeNode right;//右子树
TreeNode(int x) { val = x; }
}
实现思路
根据题目描述可知,函数的输入参数为原二叉树的前序遍历和后续遍历。由二叉树知识可知,前序遍历序列的第一个元素就是根节点。获取根节点后依次进行以下几步操作
- 遍历中序遍历序列,获取根节点在序列中的位置
- 完成第一步后,可以获取左子树的节点数和左子树的中序遍历序列(右子树一样)
- 遍历前序遍历序列,获取左子树的前序遍历序列和右子树的前序遍历序列
- 传入左右子树的前中序遍历序列,递归进行左右子树的建树操作
代码实现
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
TreeNode root=new TreeNode(pre[0]);//前序遍历的第一个数一定为根节点
int len=pre.length;
//当前序遍历只有一个数的时候,表示该节点为叶子节点
if(len==1){
root.left=null;
root.right=null;
return root;
}
int rootvalue=root.val; //rootval为根节点的值
int i;
//找到中序遍历中的根节点位置,赋值为i
for(i=0;i<len;i++){
if(rootvalue==in[i])
break;
}
//创建左子树
if(i>0){
int[] pr=new int[i];
int[] ino=new int[i];
for(int j=0;j<i;j++){
//获取左子树的前序遍历序列
pr[j]=pre[j+1];
//获取左子树的中序遍历序列
ino[j]=in[j];
}
//递归进行左子树的建树
root.left=reConstructBinaryTree(pr,ino);
}else{
root.left=null;
}
//创建右子树
if(len-i-1>0){
int[] pr=new int[len-i-1];
int[] ino=new int[len-i-1];
for(int j=i+1;j<len;j++){
ino[j-i-1]=in[j];
pr[j-i-1]=pre[j];
}
//递归进行右子树的建树操作
root.right=reConstructBinaryTree(pr,ino);
}else{
root.right=null;
}
return root;
}