【剑指offer - C++/Java】4、重建二叉树

牛客网题目链接:重建二叉树

文章目录

  • 0 题目描述:
  • 1、题目分析
  • 2、代码
    • 2.1、java代码
    • 2.2 C++代码
  • 3、总结

0 题目描述:

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

1、题目分析

题目给出前序遍历和中序遍历,让重建二叉树。由前序遍历特性知前序遍历的第一个节点,肯定是根节点。那么找到了根节点,接下来找到左子树与右子树即可。由中序遍历的特性知中序遍历中,根节点位于中间某一个位置,它的左边是左子树节点,右边是右子树的节点。从而我们就找到了左子树的所有节点与右子树的所有节点以及根节点。然后我们让根节点左指针指向左子树的根节点,根节点右子树指针指向右子树的根节点。那么接下来的问题就是要求左子树的根节点与右子树的根节点,然后再让左子树的根节点指向它的左子树与右子树,右子树的根节点指向它的左子树与右子树…很明显,这是一个递归过程。

下面我们看以下图示,来理解找根节点,左子树与右子树的过程。

假设某一棵树如下:

在这里插入图片描述

它的前序遍历位:[1,2,4,7,3,5,6,8] 后序遍历:[4,7,2,1,5,3,8,6]

那么第一次找根节点与左右子树,如下图:

在这里插入图片描述

此时,可以得出如下我们要求的二叉树是如下样式:

在这里插入图片描述

以上我们只知道左子树和右子树包含哪些节点,并不知道左子树和右子树长什么样。

接下来我们再递归的求解左子树序列与右子树序列。,找到左子树的根节点与右子树的根节点。

递归求解左子树:

在这里插入图片描述

此时,可以得出如下二叉树的形式:

在这里插入图片描述

同理,此时对于左子树的根节点2,再对其递归求解它的左子树与右子树的二叉树,其中右子树位空不用求解直接指向null,左子树还有节点,那么利用左子树的节点的前序序列与中序序列,再次递归求解即可。

最终得出如下图所示的左子树二叉树:

在这里插入图片描述

递归求解右子树:

左子树递归求解完后,就递归求解右子树:

在这里插入图片描述

此时可以得到如下二叉树的形式:
在这里插入图片描述

同理,测试再对于右子树的节点3,再对其进行递归求它的左子树与右子树,最终得到右子树的二叉树为:

在这里插入图片描述

所以,最终的二叉树就是如下图:

在这里插入图片描述

2、代码

2.1、java代码

public class Solution {public TreeNode reConstructBinaryTree(int [] pre,int [] in) {if(pre.length-1==0 || in.length-1==0 || pre.length != in.length)return null;return reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);}public TreeNode reConstructBinaryTree(int[] pre,int preStart,int preEnd,int[] in,int inStart,int inEnd){int rootVal=pre[preStart];TreeNode root=new TreeNode(rootVal);//根节点root.left=root.right=null;if(preStart==preEnd || inStart==inEnd)return root;//如果只有一个数了则只有一个节点int inIndex=inStart;//代表中序遍历中的根节点的位置while(in[inIndex]!=rootVal && inIndex<=inEnd)inIndex++;//找到这个inIndex的位置int lnum=inIndex-inStart;//左子树节点的个数int rnum=inEnd-inIndex;//右子树节点的个数if(lnum>0){root.left=reConstructBinaryTree(pre,preStart+1,preStart+lnum,in,inStart,inIndex-1);}if(rnum>0){root.right=reConstructBinaryTree(pre,preStart+lnum+1,preEnd,in,inIndex+1,inEnd);}return root;}
}

注释:代码中inIndex代表中序遍历中根节点的位置,lnum代表左子树节点的个数,rnum代表右子树节点的个数。

2.2 C++代码

class Solution {
public:TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {if(pre.size()==0 || vin.size()==0 || pre.size()!=vin.size())return nullptr;return reConstructBinaryTree(pre,0,pre.size()-1,vin,0,vin.size()-1);}TreeNode* reConstructBinaryTree(vector<int> pre, int preStart,int preEnd,vector<int> vin, int vinStart,int vinEnd){int rootVal=pre[preStart];TreeNode* root = new TreeNode(rootVal);//根节点root->left=nullptr;root->right=nullptr;if(preStart == preEnd || vinStart==vinEnd)return root;//如果只有一个数了则只有一个节点int vIndex = vinStart;//代表中序遍历中的根节点的位置while(rootVal != vin[vIndex] && vIndex <= vinEnd)vIndex++;//找到这个vIndex 的位置int lnum = vIndex-vinStart;//左子树节点的个数int rnum = vinEnd-vIndex;//右子树节点的个数int leftIndex = preStart+lnum;if(lnum>0){root->left = reConstructBinaryTree(pre,preStart+1,leftIndex,vin,vinStart,vIndex-1);}if(rnum>0){root->right = reConstructBinaryTree(pre,leftIndex+1,preEnd,vin,vIndex+1,vinEnd);}return root;}
};

注释:上面vIndex代表中序遍历中根节点的位置,lnum代表左子树的节点数目,rnum代表右子树的节点的数目。

3、总结

以上代码并不是最简洁的代码,但是目的是为了突出这种算法的实现过程。希望每个人都能很容易就理解这种递归的过程。

学习探讨加:
qq:1126137994
微信:liu1126137994

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

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

相关文章

Windows下Android开发环境 搭建

1、 下载Android SDK &#xff08;1&#xff09;官网下载解压后即可用。 在http://androidappdocs.appspot.com/sdk/index.html 下选择 合适自己的平台下载&#xff0c;下载后解压 运行 【SDK Setup.exe】 出现在线安装包。 会出现“Failed to fetch URL https://dl-ssl.google…

【OS学习笔记】二 汇编语言和汇编软件

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 上一篇文章讲解了处理器&#xff0c;内存&#xff0c;和指令。学习了Intel 8086处理器的相关知识&#xff0c;如Intel通用寄存器的作用&#xff0c;程…

【软件开发底层知识修炼】一 深入浅出处理器之一 微处理器与微控制器

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信&#xff1a; liu1126137994学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff1a; 780902027 深入浅出处理器这几篇文章可能你觉得对软件…

【软件开发底层知识修炼】二 深入浅出处理器之二 中断的概念与意义

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 上一篇文章我们学习了微处理器与微控制器的区别。点击链接查看上一篇文章的内容&#xff1a;微处理器与微控制器 本篇文章我们学习中断的概念与意义。…

推荐学习-数据结构与算法之美

推荐一个学习资源&#xff1a;数据结构与算法之美。主要包括以下几个学习内容&#xff1a; 20个经典数据结构与算法100个真实项目场景案例文科生都能看懂的算法手绘图解轻松搞定BAT的面试通关秘籍 作者&#xff1a;王争 前谷歌工程师 内容很强。扫描我的二维码买的话&#x…

【软件开发底层知识修炼】三 深入浅出处理器之三 内存管理与内存管理单元(MMU)

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 上一篇文章学习了中断的概念与意义&#xff0c;以及中断的应用-断点调试原理。点击链接复习上一篇文章&#xff1a;中断的概念与意义 本片文章继续学…

hbase思维导图

持续更新中 hbase思维导图 感谢分享1. hbase 概述2. hbase 数据模型3. hbase 架构4. hbase 的读写流程5. hbase 优化1. hbase 概述 2. hbase 数据模型 3. hbase 架构 4. hbase 的读写流程 5. hbase 优化

安卓从入门到进阶推荐学习方法与书籍整理(pdf)

前言&#xff1a;技术书阅读方法论 一.速读一遍&#xff08;最好在1~2天内完成&#xff09; 人的大脑记忆力有限&#xff0c;在一天内快速看完一本书会在大脑里留下深刻印象&#xff0c;对于之后复习以及总结都会有特别好的作用。 对于每一章的知识&#xff0c;先阅读标题&…

SharePoint中的权限体系

1.MOSS中的权限结构 MOSS中的权限结构主要有三部分&#xff1a;网站权限&#xff0c;列表权限&#xff0c;个人权限。 网站权限由18种如下图&#xff1a; 列表权限由12种&#xff0c;如下图&#xff1a; 个人权限由三种&#xff0c;如下图&#xff1a; 2.权限级别 上面提供…

MobaXterm_Personal_20.1最简单方式链接阿里云服务器

MobaXterm_Personal_20.1链接购买的阿里云服务器1.登录到阿里云首页2.阿里云首页3. 找到 服务器实例4. 重置密码5. 配置 MobaXterm_Personal_20.15.1 MobaXterm_Personal_20.1介绍6. 输入重置的密码1.登录到阿里云首页 2.阿里云首页 3. 找到 服务器实例 4. 重置密码 5. 配置 Mo…

机器学习和python学习之路精心整理技术书从入门到进阶

“机器学习&#xff0f;深度学习并不需要很多数学基础&#xff01;”也许你在不同的地方听过不少类似这样的说法。对于鼓励数学基础不好的同学入坑机器学习来说&#xff0c;这句话是挺不错的。不过&#xff0c;机器学习理论是与统计学、概率论、计算机科学、算法等方面交叉的领…

FusionChart完全入门手册8

动画样式类型 FusionCharts做得最好的事情之一就是图表动画序列&#xff0c;这是用户静静乐道的。默认情况下&#xff0c;FusionCharts仅在数据绘制&#xff08;柱状图、饼图、折线图等&#xff09;时候使用动画。但是FusionCharts V3不限制你的想象力。 使用动画样式,你可以…

算法与数据结构+一点点ACM从入门到进阶吐血整理推荐书单(珍藏版)

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a; 个人微信&#xff1a; liu1126137994 学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112 学习交流资源分享qq群2&#xff1a; 780902027 前言&#xff1a;技术书阅读方法论…

工作中使用的工具

工作中使用的工具分享一下后续持续更新

【软件开发底层知识修炼】四 深入浅出处理器之四 结合高速缓存以及TLB与虚拟内存

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 文章目录0、回顾1、高速缓存&#xff08;Cache&#xff09;的引入2、利用TLB加速地址翻译3、Cache与物理内存是如何映射的3.1、直接映射法&#xff1a…

研发中会使用到的工具

研发中会使用到的工具分享一下后续持续更新

【软件开发底层知识修炼】五 gcc-C语言编译器

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 文章目录1、GCC与gcc2、gcc的幕后工作3、实用的gcc选项3.1、预处理选项-解决宏错误3.2、-S参数-辅助编写汇编程序的好方法3.3、获取系统头文件路径3.4…

思维模型分享

思维模型1.思维建模1.1 模型的用途1.2构建模型的3种方法1.3多样性预测定理1.4分类模型1.5 变差模型1.5.1 解释变差的百分比1.6 模型误差分解定理1.7 多模型思维1.8 对人类行为建模1.8.1 理性行为者模式2.模型思维2.1 正态分布2.2中心极限定理2.2.1 平方根法则2.2.2 检验显著性2…

在工程中最常用的 vim使用技巧

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信&#xff1a; liu1126137994学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff1a; 780902027 文章目录1、vim编辑常用快捷键2、文件索引…