Java 实现剑指Offer 重建二叉树
害 开头还是来点题外话 今天下午不想做题了 准备把最近做的算法题整理一下 这里的这篇文章依旧会参考不少的优秀代码和博客 同时呢 也尽量多一些不一样与众不同的东西 加入自己的一丢丢思考(害 因为是自己的思考 这部分如果有错误 希望大家指正) 下面开始正题
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
import java.util.*;
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre.length==0){
return null;
}
int rootVal=pre[0];
if(pre.length==1){
return new TreeNode(rootVal);
}
int rootIndex=0;
TreeNode root=new TreeNode(rootVal);
for(int i=0;i<pre.length;i++){
if(in[i]==rootVal){
rootIndex=i;
break;
}
}
root.left=reConstructBinaryTree(Arrays.copyOfRange(pre,1,rootIndex+1),Arrays.copyOfRange(in,0,rootIndex));
root.right=reConstructBinaryTree(Arrays.copyOfRange(pre,rootIndex+1,pre.length),Arrays.copyOfRange(in,rootIndex+1,in.length));
return root;
}
}
大致思路
这块就不详细说了 网上有好多优秀的博客再讲这个 这也不是我想记录这篇博客的重点 反正就是一直递归
自己的思考
自己呢对于这个递归的出口一直有些理解的不太到位 于是便放到eclipse上debug了一下 也算是有一点点收获
import java.util.Arrays;
public class Demo1 {
public static void main(String[] args) {
Demo1 d=new Demo1();
int[] pre= {1,2,4,7,3,5,6,8};
int[] in= {4,7,2,1,5,3,6,8};
TreeNode tree=d.reConstructBinaryTree(pre, in);
}
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre.length==0){
return null;
}
int rootVal=pre[0];
if(pre.length==1){
return new TreeNode(rootVal);
}
int rootIndex=0;
TreeNode root=new TreeNode(rootVal);
for(int i=0;i<pre.length;i++){
if(in[i]==rootVal){
rootIndex=i;
break;
}
}
System.out.println(pre);
root.left=reConstructBinaryTree(Arrays.copyOfRange(pre,1,rootIndex+1),Arrays.copyOfRange(in,0,rootIndex));
root.right=reConstructBinaryTree(Arrays.copyOfRange(pre,rootIndex+1,pre.length),Arrays.copyOfRange(in,rootIndex+1,in.length));
return root;
}
}
这个是我断点位置(随意加了一句话 在这里断点) 我们来看debug的结果
这是初始刚刚第一次进入reConstructBinaryTree这个函数的过程 找到了rootVal 找到了rootIndex 对应的pre数组和in数组如上图所示
接下来 进入了第一次递归
我们看到这次递归rootVal变成了2 pre数组和in数组也有变化
接下来是一个小的递归出口
这个时候rootVa是4 当我们这一次在准备进入递归时 也就是当代码执行到这句时
我们发现 这是的pre数组是[1,1)这样的一个情况 也就是pre数组的长度为0了 通过断点我们也可以看到
这时的pre数组确确实实长度为0 我们再往下理解
代码执行到这里 返回了一个null值那么这个null值被返回到了那里呢?
null值被返回到了这里 也就是
root.left=null;//其实就是这个意思 这样就把root.left执行完毕了
接下来的话 代码又会进入root.right这部分继续往下迭代 那么又会找到新的pre数组和in数组 我这里仅仅是举了以4当root去找4的左子节点的一种小小的情况 当我们的pre数组长度为1时 又会是新的一种不同的情况 这种情况会返回一个新创建的节点这里也就不太再往下具体分析了 我觉得理解了null值这种情况 其他也是一样的(写到这里累了其实是 害)
写在最后
我觉得吧 很多人应该也看不到这里 毕竟我觉得看这么多 不如自己上手来一遍理解的透彻 害 希望大家都继续努力啊