【剑指offr--C/C++】JZ7 重建二叉树

一、题目

这里是引用
在这里插入图片描述

二、思路及代码
前序遍历:中、左、右。所以前序遍历的第一个节点是树的根节点,第二个节点是左子树的根节点。。。。
中序遍历:左、中、右。树的根节点在中间某处
我们可以根据二者的特点结合一下:对于前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}, 根据前序可知1是树的根节点,那么再看中序就可以用1分成左子树{4,7,2}和右子树{5,3,8,6}。再看前序的第二个元素是2,2就是左子树的根节点,于是{4,7}是2的左子树,2没有右子树。 …以此类推就可以得到一颗完整的树。
那么根据上面的分析,我们可以把判断过程分成3步:

  1. 读取前序的第一个元素,根据这个元素将中序数组拆分成左子树、根节点、右子树;
  2. 左、右子树各自重复上边的步骤组成自己的二叉树
  3. 创建一个根节点,左右指针分别指向第二步得到的子树节点
    显然每一个节点都可以使用上述步骤,那么我们就可以把这个过程写成递归。
/*** struct TreeNode {*	int val;*	struct TreeNode *left;*	struct TreeNode *right;*	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/
class Solution {
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param preOrder int整型vector * @param vinOrder int整型vector * @return TreeNode类*/TreeNode* reConstructBinaryTree(vector<int>& preOrder, vector<int>& vinOrder) {// write code here//若数组为空,则说明已经没有新的节点了,返回空if(vinOrder.size()==0){return NULL;} vector<int> lefttree;vector<int> righttree;int i=0;//获取左子树数组for(i;i<vinOrder.size();i++){if(vinOrder[i]==preOrder[0]){break;}else{lefttree.push_back(vinOrder[i]);}}//这里把用过的第一个节点删除掉,那么递归过程就可以一直使用preOrder[0]获取当前根节点preOrder.erase(preOrder.begin());   //删除掉第一个元素TreeNode *left=reConstructBinaryTree(preOrder, lefttree);//获取右子树数组for(int j=i+1;j<vinOrder.size();j++){righttree.push_back(vinOrder[j]);}TreeNode *right=reConstructBinaryTree(preOrder, righttree);//当前根节点TreeNode *root=new TreeNode(vinOrder[i]);       root->left=left;root->right=right;return root;}
};

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

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

相关文章

查看MySQL版本的方式

文章目录 一、使用cmd输入命令行查看二、在mysql客户端服务器里查询 一、使用cmd输入命令行查看 1、打开 cmd &#xff0c;输入命令行&#xff1a; mysql --version 2、还是打开cmd&#xff0c;输入命令行&#xff1a;mysql -V (注意了&#xff0c;此时的V是个大写的V) 二、…

海外问卷调查项目拆解(操作全流程演示)保姆级攻略具体操作

海外问卷调查是怎么做的&#xff1f;好做吗&#xff1f; 关于这个问题&#xff0c;不管我说好做、或者不好做&#xff0c;都并不能解决问题&#xff1b; 所以&#xff0c;这篇文章直接把做题的全过程展现给你看&#xff0c;你自己去真实地感受一下&#xff0c;这个玩意儿到底…

华媒舍:3个科学指导,协助油管大V写下爆款文章

油管&#xff08;YouTube&#xff09;作为一个重要的视频分享平台&#xff0c;吸引了很多的观众和原创者。作为一位油管大V&#xff0c;你可能会一直在努力提升自己的文章质量以吸引更多的观众和订阅者。下面我们就为您提供三个科学指导&#xff0c;帮助自己写下更具有爆品发展…

浅析JavaWeb内存马基础原理与查杀思路

文章目录 前言Java内存马内存马分类&原理JavaWeb三大组件注入Servlet内存马注入Filter型内存马JAVA Agent内存马 哥斯拉木马0x01 WebShell0x02 MemShell0x03 FilterShell0x04 Arthas排查0x05 scanner查杀 总结 前言 几年前写过《Web安全-一句话木马》&#xff0c;主要介绍…

stargan项目实战及源码解读

数据及代码链接见文末 ​​​​​​​论文解析&#xff1a;Star GAN论文解析-CSDN博客 1.测试模块效果与实验分析 测试数据需要准备两个文件夹src&#xff08;源&#xff09;和ref&#xff08;目标&#xff09;&#xff0c;这两个文件夹下的文件夹名称代表各个domain。 运行测…

[lesson07]函数参数的扩展

函数参数的扩展 函数参数的默认值 C中可以在函数声明时为参数提供一个默认值 当函数调用时没有提供参数的值&#xff0c;则使用默认值 参数的默认值必须在函数声明中指定 函数默认参数的规则 参数的默认值必须从右向左提供函数调用时使用了默认值&#xff0c;则后续参数必…

数据结构:详解【树和二叉树】

1. 树的概念及结构&#xff08;了解&#xff09; 1.1 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝…

小林coding图解计算机网络|基础篇02|键入网址到网页显示,期间发生了什么?

小林coding网站通道&#xff1a;入口 本篇文章摘抄应付面试的重点内容&#xff0c;详细内容还请移步&#xff1a;小林coding网站通道 文章目录 孤单小弟——HTTP真实地址查询——DNS指南好帮手——协议栈可靠传输——TCP远程定位——IP两点传输——MAC出口——网卡送别者——交…

一文搞懂 ThreadLocal

简介 ThreadLocal存取的数据&#xff0c;总是与当前线程相关&#xff0c;也就是说&#xff0c;JVM 为每个运行的线程&#xff0c;绑定了私有的本地实例存取空间&#xff0c;从而为多线程环境常出现的并发访问问题提供了一种隔离机制。 ThreadLocal的作用是提供线程内的局部变…

突破编程_前端_ACE编辑器(选中区域、跳转行以及点击事件)

1 选中区域 要在 ACE 编辑器中选中一个区域&#xff0c;通常需要使用编辑器的 selection 对象。 以下是一个简单的示例&#xff0c;展示了如何使用 ACE 编辑器的 API 来选中一个特定的区域&#xff1a; 初始化 ACE 编辑器&#xff1a;首先&#xff0c;需要在页面上初始化 AC…

arm开发板移植工具mkfs.ext4

文章目录 一、前言二、手动安装e2fsprogs1、下载源码包2、解压源码3、配置4、编译5、安装 三、移植四、验证五、总结 一、前言 在buildroot菜单中&#xff0c;可以通过勾选e2fsprogs工具来安装mkfs.ext4工具&#xff1a; Target packages -> Filesystem and flash utilit…

为移动云数据实现基于可撤销属性组的加密:多代理辅助方法

参考文献为2023年发表的Achieving Revocable Attribute Group-Based Encryption for Mobile Cloud Data: A Multi-Proxy Assisted Approach 动机 对于目前的代理辅助的可撤销基于属性加密来说&#xff0c;外包解密存一些缺点。当多个具有相同属性的用户请求外包转换时&#x…