剑指offer之重建二叉树

1 问题

重建二叉树:给定二叉树的先序遍历(根左右)和中序(左中右)遍历结果,建立这棵二叉树。输入保证二叉树无重复结点

以先序{1, 2, 4, 7, 3, 5, 6, 8}和中序{4, 7, 2, 1, 5, 3, 8, 6}为例

 

 

 

 

 

2 分析

先序遍历的特点,我们知道{1, 2, 4, 7, 3, 5, 6, 8}第一个元素1就是树的根节点,然后中序遍历{4, 7, 2, 1, 5, 3, 8, 6}的根节点在中间,因为我们从先序遍历里面得知1就是根节点,所以在中序遍历{4, 7, 2, 1, 5, 3, 8, 6}中,在中序遍历数组1的左边元素都是根节点左子树{4, 7, 2,},这里是3个元素,所以在先序数组里面根节点1的后面3个元素也是左子树{2,4,7},也是根节点的左子树,在中序遍历1的右边边元素都是{5, 3, 8, 6}都是根节点的右子树,然后我们在先序数组里面根节点1的后面第3个元素的后面到尾巴,也就是{3,5,6,8}也就是根节点的右子树。然后我们再把问题分解成构建左子树{2,4,7}和构建右子树{3,5,6,8},以此递归处理。

我们构建左子树

再构建右子树

 

 

 

 

 

 

 

3 代码实现

import java.io.*;class Tree
{public int value;public Tree left;public Tree right;public Tree(int value){this.value = value;this.left = null;this.right = null;}/***前序遍历 */public void printTree(Tree node){if (null == node)return;System.out.println("value is " + node.value);printTree(node.left);printTree(node.right);}/**得到树的根节点*/public Tree getTree(int[] preDatas, int[] inDatas){if (null == preDatas || null == inDatas){System.out.println("preDatas is null or inDatas is null");return null;}Tree tree = buildTree(preDatas, 0, preDatas.length - 1, inDatas, 0, inDatas.length - 1);return tree;}/**构建树的左右子结构*/public Tree buildTree(int[] preDatas, int preStart, int preEnd, int[] inDatas, int inStart, int inEnd){if (null == preDatas || null == inDatas){System.out.println("preDatas is null or inDatas is null");return null;}System.out.println("preStart is:" + preStart + " preEnd is" + preEnd + " inStart is " + inStart + " inEnd is" + inEnd);//这里就是进行如果树的左子节点和右子节点是否为空进行设置if (preStart > preEnd || inStart > inEnd){return null;}Tree tree = new Tree(preDatas[preStart]);for (int i = inStart; i <= inEnd; ++i){   System.out.println("preDatas[preStart] is " + preDatas[preStart]);if (preDatas[preStart] == inDatas[i]){tree.left = buildTree(preDatas, preStart + 1, preStart + i - inStart, inDatas, inStart, i - 1);tree.right = buildTree(preDatas, preStart + i - inStart + 1, preEnd, inDatas, i + 1, inEnd);break;}}return tree;}
}class test  
{public static void main (String[] args) throws java.lang.Exception{int[] preDatas = {1, 2, 4, 7, 3, 5, 6, 8};int[] inDatas = {4, 7, 2, 1, 5, 3, 8, 6};Tree test =  new Tree(0);Tree tree = test.getTree(preDatas, inDatas);if (tree == null){System.out.println("tree is null");return;}//我们进行前序打印树        test.printTree(tree);}
}

 

 

 

 

 

 

4 运行结果

preStart is:0 preEnd is7 inStart is 0 inEnd is7
preDatas[preStart] is 1
preDatas[preStart] is 1
preDatas[preStart] is 1
preDatas[preStart] is 1
preStart is:1 preEnd is3 inStart is 0 inEnd is2
preDatas[preStart] is 2
preDatas[preStart] is 2
preDatas[preStart] is 2
preStart is:2 preEnd is3 inStart is 0 inEnd is1
preDatas[preStart] is 4
preStart is:3 preEnd is2 inStart is 0 inEnd is-1
preStart is:3 preEnd is3 inStart is 1 inEnd is1
preDatas[preStart] is 7
preStart is:4 preEnd is3 inStart is 1 inEnd is0
preStart is:4 preEnd is3 inStart is 2 inEnd is1
preStart is:4 preEnd is3 inStart is 3 inEnd is2
preStart is:4 preEnd is7 inStart is 4 inEnd is7
preDatas[preStart] is 3
preDatas[preStart] is 3
preStart is:5 preEnd is5 inStart is 4 inEnd is4
preDatas[preStart] is 5
preStart is:6 preEnd is5 inStart is 4 inEnd is3
preStart is:6 preEnd is5 inStart is 5 inEnd is4
preStart is:6 preEnd is7 inStart is 6 inEnd is7
preDatas[preStart] is 6
preDatas[preStart] is 6
preStart is:7 preEnd is7 inStart is 6 inEnd is6
preDatas[preStart] is 8
preStart is:8 preEnd is7 inStart is 6 inEnd is5
preStart is:8 preEnd is7 inStart is 7 inEnd is6
preStart is:8 preEnd is7 inStart is 8 inEnd is7
value is 1
value is 2
value is 4
value is 7
value is 3
value is 5
value is 6
value is 8

 

 

 

 

 

5 总结

中途遇到这个一个错误

error: <identifier> expected

是我在手写函数的时候参数前面忘记了定义类型,所以报这个错误。

我们这里用了4个指针,分别是先序的起尾指针和中序的起尾指针,然后我们不断更新4个指针指针的位置,然后当先序的起指针大于尾指针的时候或者中序的起指针大于尾指针的时候我们就构建空指针,就这样递归处理就行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/288063.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArcGIS 10.5专题地图制作自定义漂亮图框

先来看一下效果: 下面来说明如何在ArcGIS软件里面实现自定义图框。 1. 【自定义】→【样式管理器】→【Administrator.style】→【边框】→【新建】→【常规边框】。 2. 点击【更改符号】。 3. 点击【编辑符号】。

当我会AOP之后,去丈母娘家都是挺着胸脯!

当和朋友谈到AOP时&#xff0c;第一映像会说AOP的应用层面&#xff0c;比如拦截器、过滤器&#xff0c;实现复用等等使用层面上。这些应用层面上的回答远远没有深入AOP的思想。是的&#xff0c;AOP是思想&#xff0c;面向切面思想。既然是编程思想&#xff0c;那我们就有必要了…

Ubuntu系统备份工具大全(官方整理推荐)

其实官方在系统备份这块已经有Wiki整理和收集各类实用的工具。以下是翻译自官方Wiki的部分文档&#xff1a; 备份工具 wiki文档实用程序 工具 界面 格式类型 Raw/File 支持 远程 增量 差异 自动化 Dj Dup 图形&#xff08;集成到系统工具&#xff09; File 是 是 …

python 最简单的实现适配器设计模式

适配器设计模式是懒得改动某些代码&#xff0c;或者某些接口不方便改动的时候&#xff0c;使用一个特定的封装&#xff0c;一些特定的编写办法&#xff0c;使不同的接口可以使用同种调用方式使用。 更简单的说话则是&#xff0c;例如几个不同的接口 aliyun、qiniuyun、tencent…

Envi和ArcGIS软件打开和处理.NC4数据

NC4是NetCDF-4的简缩形式。 NetCDF(network Common Data Form)网络通用数据格式是由美国大学大气研究协会(University Corporation for Atmospheric Research,UCAR)的Unidata项目科学家针对科学数据的特点开发的,是一种面向数组型并适于网络共享的数据的描述和编码标准。目…

cocos2d-x 3.0rc2中读取sqlite文件

cocos2d-x 3.0rc2中读取sqlite文件的方式&#xff0c;在Android中直接读取软件内的会失败。须要复制到可写的路径下 sqlite3* dbFile NULL;std::string path;path FileUtils::getInstance()->fullPathForFilename("db1.db");#if CC_TARGET_PLATFORM CC_PLATFOR…

hse不起振 stm8_STM8S207使用外部24M晶振不起振的解决办法

具体表现&#xff1a;1、使用 20M 的外部晶振&#xff0c;程序也能正常工作。2、使用 24M 的外部晶振&#xff0c;就不能工作&#xff0c;经示波器测量&#xff0c;晶振没有起振。3、为了去除晶振的原因&#xff0c;就换了一个 24M 的晶振&#xff0c;结果还是不行&#xff0c;…

剑指offer之数组出现次数超过一半的数字

1 问题 数组中有一个数字出现了次数超过数组长度的一半&#xff0c;请找出这个数字。 比如{1,2,3,2,2,2,5,4,2},我们知道这个数是2 2 分析 我们数组元素个数分为单数和双数 1&#xff09;数组长度是单数的情况下 我们有5个元素&#xff0c;里面至少3个2&#xff0c;还有2个…

C#多线程调试

概要这篇文章主要分享多线程部分调试技巧&#xff0c;在日常的开发工作中会经常遇到多线程调试的需要。在我们调试的过程中会出现断点的焦点在多个线程之间“反复横跳”根本无法集中跟踪某一个线程的操作链路。那么今天我们来看看如何调试操作。如果有其它需要的可以参考下面微…

最速下降法(梯度下降法)

最速下降法的影子在机器学习中正是无处不在&#xff0c;它简单实用。 一、表示 在最速下降法中&#xff0c;对权值向量w的连续调整是在最速下降的方向上&#xff0c;即它是与梯度向量方向相反的&#xff0c;梯度向量记为&#xff08;1&#xff09;&#xff0c;简记&#xff08;…

游戏服务器销售额,游戏服务器销售一个月

游戏服务器销售一个月 内容精选换一换应用容器化改造有三种方式&#xff0c;您可单击这里查看。本教程以某游戏为例&#xff0c;将该游戏进行微服务的架构改造&#xff0c;再进行容器化。本教程不对改造细节做深度讲解&#xff0c;仅讲解大致的建议。如需要详细了解容器化改造的…

使用AppCompat项目模版

2019独角兽企业重金招聘Python工程师标准>>> 使用AppCompat项目模版 从Android API 22开始&#xff0c;谷歌推荐使用AppCompatActivity来构建带标题栏的App&#xff0c;而不是原有的ActionBarActivity。如果用户想要使用AppCompatActivity&#xff0c;可以使用Xamar…

python3 最基本且简单的实现组合设计模式

组合模式是把一个类别归为一个整体&#xff0c;并且组织多个整体之间的关系&#xff0c;使用通过树形结构来描述所有整体。 一般的编写方式为一个类别对象下添加多个该对象的元素&#xff0c;该对象又为其它对象下的元素。简单来说就是一个学校有一个总部&#xff0c;总部下有…

SQL Server 2008 阻止保存要求重新创建表的更改问题

习惯了使用SQL Server 2005进行数据库系统开发,为了赶上潮流的发展,最近在使用SQL 2008数据库,本来建好了一个表,后面需要对表的设计做些修改(比如字段长度的修改,忘记了设置主键等等),结果弹出错误提示,说什么“组织保存要求重新创建表的更改”,如下所示: 解决办法…

华为手机像素密度排行_华为手机也分三六九等,3款几乎“0差评”,支持5G价格良心...

随着9月15日美国对华为禁令的生效&#xff0c;台积电、三星等都无法再为华为供货。目前&#xff0c;华为芯片库存有限&#xff0c;可以说是用一片少一片&#xff0c;十分珍贵。因此&#xff0c;许多消费者都希望能在华为芯片用完之前&#xff0c;换一部新机。不过&#xff0c;华…

$geoNear

怎么使用mongoose的geoNear 2014-11-26 15:05:20| 分类&#xff1a; mongodb | 标签&#xff1a;mongoose |举报|字号 订阅 下载LOFTER我的照片书 |起因 在开发的时候碰到一个情况&#xff0c;数据源有100个景点&#xff0c;需要对给出的一个点&#xff0c;求距离它最近的…

linux shell之删除当前文件夹不包含文件1和文件2的其他所有文件

1 问题 删除当前文件夹不包含文件1和文件2的其他所有文件&#xff0c;这个当前文件夹里面可以包含子文件夹&#xff0c;然后子文件夹里面也有文件1和文件2&#xff0c;但是这里的文件1和文件2也不应该被删除。 2 解决办法 可以用如下shell命令都行 find . -type f -not -name…

甲骨文宣布供应链管理云平台支持LogFire仓库管理系统

本文讲的是 :甲骨文宣布供应链管理云平台支持LogFire仓库管理系统 ,【IT168 资讯】甲骨文发布了一系列对其供应链管理产品的更新&#xff0c;并表示&#xff0c;云平台现在支持去年收购LogFire的仓库管理系统(WMS)。 ▲ Oracle将在最新版本的Oracle供应链管理(SCM)Cloud产品…

i5老是显示无服务器,为什么懂电脑的人选择买i5处理器,而不是i7,背后的真实原因?...

摘要&#xff1a;我们在选购电脑的时候经常会被五花八门的型号参数看的神魂颠倒&#xff0c;有很多朋友对cpu的理解也仅限于i7一定比i5好&#xff0c;i5一定比i3好的阶段。然而&#xff0c;对于很多懂电脑的人来说&#xff0c;选购电脑时&#xff0c;都不会买i7的CPU处理器&…

C# 对类型系统扩展性的改进

前言C# 对类型系统进行改进一直都没有停过&#xff0c;这是一个长期的过程。C# 8 之后则主要围绕扩展性方面进行各种改进&#xff0c;目前即将发布的 C# 11 中自然也包含该方面的进度。这些改进当然还没有做完&#xff0c;本文则介绍一下已经推出和即将推出的关于这方面改进的新…