【剑指offer】【重建二叉树】【二叉树的应用】

题目描述:

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

题目思路:

借用牛客网某大神的思路:
思路:利用递归依次判断每个节点的左子树和右子树,若可以延伸,则继续递归,若不可以延伸,则将其孩子节点设置为null。
分析:举个例子来说:
int[] pre = {1,2,4,7,3,5,6,8}//前序遍历
int[] in = {4,7,2,1,5,3,8,6}//中序遍历
1. pre的第一个节点“1”为根节点,在in中的位置下标为3,则可以判断in中{4,7,2},{5,3,8,6}分别为节点“1”的左子树与右子树的中序遍历。然后在pre中从“2”开始数,前3个数{2,4,7},后4个数{3,5,6,8}分别为节点“1”的左子树与右子树的前序遍历。
2. 接下来,再判断节点“1”的左右子树的子树。
以“1”的左子树pre{2,4,7},in{4,7,2}为例,pre的第一个节点“2”当前子树的根节点,{4,7}为节点“2”的左子树中序遍历也是前序遍历。
3. 依此判断,最终将所有的叶子结点找出。

代码:

/**
 * 重建二叉树
 * @author HeMing
 *
 */
public class ReConstructBinaryTree {

    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        TreeNode root = reConstructBinaryTree(pre, in, 0, pre.length-1, 0, in.length-1);
        return root;      
    }

    public TreeNode reConstructBinaryTree(int[] pre, int[] in, 
                                          int preStart, int preEnd, 
                                          int inStart, int inEnd){
        if (preStart>preEnd||inStart>inEnd){
            return null;
        }
        TreeNode root = new TreeNode(pre[preStart]);
        for (int i = inStart; i <= inEnd; i++){
            if (pre[preStart]==in[i]){
                root.left = reConstructBinaryTree(pre,in,preStart+1,i-inStart+preStart,inStart,i-1);
                root.right = reConstructBinaryTree(pre,in,i-inStart+preStart+1,preEnd,i+1,inEnd);
            }
        }
        return root;       
    }

总结:

递归大法好,但是理解特别抽象,要多练习这样的思路。

下载前可以先看下教程 https://pan.quark.cn/s/16a53f4bd595 小天才电话手表刷机教程 — 基础篇 我们将为您简单的介绍小天才电话手表新机型的简单刷机以及玩法,如adb工具的使用,magisk的刷入等等。 我们会确保您看完此教程后能够对Android系统有一个最基本的认识,以及能够成功通过magisk root您的手表,并安装您需要的第三方软件。 ADB Android Debug Bridge,简称,在android developer的adb文档中是这么描述它的: 是一种多功能命令行工具,可让您与设备进行通信。 该命令有助于各种设备操作,例如安装和调试应用程序。 提供对 Unix shell 的访问,您可以使用它在设备上运行各种命令。 它是一个客户端-服务器程序。 这听起来有些难以理解,因为您也没有必要去理解它,如果您对本文中的任何关键名词产生疑惑或兴趣,您都可以在搜索引擎中去搜索它,当然,我们会对其进行简单的解释:是一款在命令行中运行的,用于对Android设备进行调试的工具,并拥有比一般用户以及程序更高的权限,所以,我们可以使用它对Android设备进行最基本的调试操作。 而在小天才电话手表上启用它,您只需要这么做: - 打开拨号盘; - 输入; - 点按打开adb调试选项。 其次是电脑上的Android SDK Platform-Tools的安装,此工具是 Android SDK 的组件。 它包括与 Android 平台交互的工具,主要由和构成,如果您接触过Android开发,必然会使用到它,因为它包含在Android Studio等IDE中,当然,您可以独立下载,在下方选择对应的版本即可: - Download SDK Platform...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值