Java 实现剑指Offer 重建二叉树(递归出口)

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值这种情况 其他也是一样的(写到这里累了其实是 害)

写在最后

我觉得吧 很多人应该也看不到这里 毕竟我觉得看这么多 不如自己上手来一遍理解的透彻 害 希望大家都继续努力啊

发布了39 篇原创文章 · 获赞 19 · 访问量 1488

猜你喜欢

转载自blog.csdn.net/weixin_44222272/article/details/104946674