1028. 从先序遍历还原二叉树(三种方法:栈+递归+集合)

文章目录

  • 1028. 从先序遍历还原二叉树(三种方法:栈+递归+集合)
    • 一、栈+ while迭代
      • 1.思路
      • 2.代码
    • 二、递归法
      • 1.思路
      • 2.代码
    • 三、集合存储
      • 1.思路
      • 2.代码


1028. 从先序遍历还原二叉树(三种方法:栈+递归+集合)


在这里插入图片描述
在这里插入图片描述

一、栈+ while迭代

1.思路

1.遍历整个字符串,从0开始,根节点在第0层
2.用level记录层数,每遇到一个-字符,当前层数+1
3.用val记录要插入的结点的值,遍历取到的数字,通过字符运算得到值。
4.找到当前要插入结点的父结点,栈的大小要小于当前层数
5.如果节点只有一个子节点,那么保证该子节点为左子节点。
6.将创建的新结点入栈
7.除了根节点,其他子节点全部出栈,返回根节点

2.代码

    public TreeNode recoverFromPreorder(String traversal) {Stack<TreeNode> stack = new Stack<>();//用栈来存储结点for (int i = 0; i < traversal.length(); ) {//遍历整个字符串,从0开始,根节点在第0层int level = 0;//记录当前层数while (traversal.charAt(i) == '-') {//每遍历到一个-,层数累加level++;i++;}int val = 0;//查看当前要插入结点的数字while (i < traversal.length() && traversal.charAt(i) != '-') {//当前的字符是数字,并且未超过字符串val = val * 10 + (traversal.charAt(i) - '0');//根据字符的相加,遍历字符串找数字时 只能一个数字一个数字的转,// 但是字符串中连续的数字是一个多位数,需要前面的数字*10变高位,再加上后面的数,// 成为一个数,作为新结点的值i++;}while (stack.size() > level) {stack.pop();//找到当前要插入结点的父结点}TreeNode node = new TreeNode(val);//创建新结点if (!stack.isEmpty()) {//如果节点只有一个子节点,那么保证该子节点为左子节点。if (stack.peek().left == null) {stack.peek().left = node;} else {stack.peek().right = node;}}stack.add(node);//入栈}while (stack.size() > 1) {stack.pop();//要返回根节点,出到栈只有一个结点}return stack.pop();}

二、递归法

1.思路

1.利用helper函数,根据字符和对应深度创建结点,还原二叉树
2.每遇到-字符,层数加一
3.如果遍历的深度和获取到的深度不一致,返回空
4.当深度等于层数时,下一个结点的位置从index + level开始
5.通过字符运算获取数字,同时创建结点
6.根节点的左树调用helper函数递归,如果左子节点是空,那么右子节点肯定也是空的
7.如果根节点的左树不为空,要想添加结点,递归右树。
8.最终返回根节点

2.代码

    //102. 二叉树的层序遍历---递归写法int index = 0;//index记录遍历到字符串的哪个位置public TreeNode recoverFromPreorder3(String traversal) {return helper(traversal,0);}public TreeNode helper(String s, int depth) {//helper函数用来创建二叉树int level = 0;//记录层数while (index + level < s.length() && s.charAt(index + level) == '-') {level++;}//如果遍历的深度和获取到的深度不一致,返回空if (level != depth){return null;}int next = index + level;//获取数字while (next < s.length() && s.charAt(next) != '-')next++;int val = Integer.parseInt(s.substring(index + level, next));index = next;//创建结点TreeNode root = new TreeNode(val);root.left = helper(s, depth + 1);if (root.left == null) {//如果左子节点是空,那么右子节点肯定也是空的root.right = null;} else {root.right = helper(s, depth + 1);}return root;}

三、集合存储

1.思路

1.使用正则匹配把字符串S拆成不同的数字存进数组中,用集合list来存储结点
2.将根节点添加到list中,层数从1开始,不包括根节点
3.数组存储的位置不为空时,根据转换的值创建结点
4.将结点加入到集合中
5.获取父结点,插入结点,并从新设置层数,果满了,层数加一
6.最终返回根节点

2.代码

    //102. 二叉树的层序遍历--正则匹配public TreeNode recoverFromPreorder2(String traversal) {String[] valus = traversal.split("-");//使用正则匹配把字符串S拆成不同的数字,用集合list来存储结点List<TreeNode> list = new ArrayList<>();list.add(new TreeNode(Integer.valueOf(valus[0])));//根节点//根节点添加到list中int level = 1;//层数层1开始,不包括根节点for (int i = 1; i < valus.length; i++) {if (!valus[i].isEmpty()) {//数组存储的位置不为空TreeNode node = new TreeNode(Integer.valueOf(valus[i]));//根据转化的值,创建结点//因为是前序遍历,每层我们只需要存储一个结点即可,这个节点值有可能//会被覆盖,如果被覆盖了说明这个节点以及他的子节点都以及遍历过了,//所以不用考虑被覆盖问题list.add(level, node);//将结点加入到集合中TreeNode parent = list.get(level - 1);//获取父结点,插入结点,并从新设置层数if (parent.left == null) {parent.left = node;} else {parent.right = node;}level = 1;} else {level++;//如果满了,层数加一}}return list.get(0);}

点击移步博客主页,欢迎光临~

偷cyk的图

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

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

相关文章

hive报错:FAILED: NullPointerException null

发现问题 起因是我虚拟机的hive不管执行什么命令都报空指针异常的错误 我也在网上找了很多相关问题的资料&#xff0c;发现都不是我这个问题的解决方法&#xff0c;后来在hive官网上与hive 3.1.3版本相匹配的hadoop版本是3.x的版本&#xff0c;而我的hadoop版本还是2.7.2的版本…

HTTPS的加密过程

文章目录 前言一、为什么需要加密&#xff1f;二、只用对称加密可以吗&#xff1f;三、只使用非对称加密四、双方都使用非对称加密五、使用非对称加密对称加密六、引入证书1.如何放防止数字证书被篡改&#xff1f;2.中间人有可能篡改该证书吗&#xff1f;3.中间人有可能掉包该证…

【YOLO系列】YOLOv9论文超详细解读(翻译 +学习笔记)

前言 时隔一年&#xff0c;YOLOv8还没捂热&#xff0c;YOLO系列最新版本——YOLOv9 终于闪亮登场&#xff01; YOLOv9的一作和v7一样。v4也有他。 他于2017年获得台湾省National Central University计算机科学与信息工程博士学位&#xff0c;现在就职于该省Academia Sinica的…

机器视觉——硬件选型

1、相机选型 在选择机器视觉相机时&#xff0c;通常需要考虑以下几个方面&#xff1a; 1、分辨率&#xff1a;相机的分辨率决定了其拍摄图像的清晰度和细节程度。根据具体的应用需求&#xff0c;可以选择适当的分辨率范围。 2、帧率&#xff1a;帧率表示相机每秒钟能够拍摄的…

2023年营养保健品线上电商市场行业分析(2024年营养保健行业未来趋势分析)

近年来&#xff0c;受人口老龄化、养生年轻化等因素驱动&#xff0c;保健品行业增长强劲&#xff0c;加之越来越多的年轻人也加入养生大军&#xff0c;成为保健品市场上的一股新力量&#xff0c;进一步带动市场扩容。 鲸参谋数据显示&#xff0c;2023年度&#xff0c;京东平台…

[pdf]《软件方法》2024版部分公开-共196页

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 潘加宇《软件方法》2024版部分公开pdf文件&#xff0c;共196页&#xff0c;已上传CSDN资源。 也可到以下地址下载&#xff1a; http://www.umlchina.com/url/softmeth2024.html 如果…

Ubuntu20.04 ssh终端登录后未自动执行.bashrc

sudo vim ~/.profile输入以下内容 if [ -n "$BASH_VERSION" ]; then if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi fi 执行 source ~/.profile重新测试 其他答案 如果你的~/.bashrc文件在Ubuntu中没有自动生效&#xff0c;…

解析电源模块测试条件与测试步骤 快速完成测试

高温高湿储存测试是电源模块环境适应性测试内容之一&#xff0c;在实际使用过程中由于应用场景不同电源所处的环境也是多样的&#xff0c;因此需要测试电源对各种环境的适应能力&#xff0c;提高电源的性能和可靠性。 电源高温高湿存储测试的目的是为了测量环境对电源结构、元件…

C语言第三十三弹---动态内存管理(上)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 动态内存管理 1、为什么要有动态内存分配 2、malloc和free 2.1、malloc 2.2、free 3、calloc和realloc 3.1、calloc 3.2、realloc 4、常见的动态内存的错…

气象数据收集

1、国家气象科学数据中心 预报数据:需要定制,收费10万+ 观测数据:国家气象信息中心-中国气象数据网 (cma.cn)https://data.cma.cn/data/cdcdetail/dataCode/A.0012.0001.html 地面基本气象观测数据 滞后2天 滞后一天 路面数据同化系统,实时 国家气象信息中心-中国气象数…

11.以太网交换机工作原理

目录 一、以太网协议二、以太网交换机原理三、交换机常见问题思考四、同网段数据通信全过程五、跨网段数据通信全过程六、关键知识七、调试命令 前言&#xff1a;在网络中传输数据时需要遵循一些标准&#xff0c;以太网协议定义了数据帧在以太网上的传输标准&#xff0c;了解以…

android移动应用开发基础答案,安卓工程师面试题

一线企业的app都是多线程和多进程的&#xff0c;而Android进程间通信机制就是Binder&#xff0c;原生的线程间通信则是Handler&#xff0c;Binder和Handler是了解安卓运行机制必须要掌握的一个知识点&#xff0c;更是一线企业面试必问的知识点&#xff01; 以下几道就是大厂关于…

【QT+QGIS跨平台编译】之五十五:【QGIS_CORE跨平台编译】—【qgsmeshcalcparser.cpp生成】

文章目录 一、Bison二、生成来源三、构建过程一、Bison GNU Bison 是一个通用的解析器生成器,它可以将注释的无上下文语法转换为使用 LALR (1) 解析表的确定性 LR 或广义 LR (GLR) 解析器。Bison 还可以生成 IELR (1) 或规范 LR (1) 解析表。一旦您熟练使用 Bison,您可以使用…

Unity中URP实现水体(整理优化)

文章目录 前言一、优化水的深度1、我们把 水流动的方向 和 水深浅过渡值&#xff0c;整合到一个四维变量中2、修改 水体流动方向3、在片元着色器中&#xff0c;修改使用过渡变量 二、优化泡沫三、优化水下的扭曲1、修复原本扰动UV的计算 四、优化水面高光1、把高光强度、光滑度…

红队基础设施建设

文章目录 一、ATT&CK二、T1583 获取基础架构2.1 匿名网络2.2 专用设备2.3 渗透测试虚拟机 三、T1588.002 C23.1 开源/商用 C23.1.1 C2 调研SliverSliver 对比 CS 3.1.2 CS Beacon流量分析流量规避免杀上线 3.1.3 C2 魔改3.1.4 C2 隐匿3.1.5 C2 准入应用场景安装配置说明工具…

深度学习 精选笔记(2)自动求导与概率

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…

Linux系统——LAMP架构

目录 一、LAMP架构组成 1.LAMP定义 2.各组件的主要作用 3.CGI和FastCGI 3.1CGI 3.3CGI和FastCGI比较 4.PHP 4.1PHP简介 4.2PHP的Opcode语言 4.3PHP设置 二、LAMP架构实现 1.编译安装Apache httpd服务 2.编译安装Mysql 3.编译安装PHP 4.安装论坛 5.搭建博客 W…

Linux编程 2.4 文件和目录-Linux文件系统结构

1、文件操作基本元素 文件操作相关的最基本元素是&#xff1a;目录结构、索引节点和文件的数据本身。 目录结构&#xff08;目录项&#xff09;索引节点&#xff08;i节点&#xff09;文件的数据 2、文件系统的三个区域 属性&#xff1a; 超级块&#xff1a;存放文件系统本身…

【学习心得】Python调用JS的三种常用方法

在做JS逆向的时候&#xff0c;一种情况是直接用Python代码复现JS代码的功能&#xff0c;达成目的。但很多时候这种方法有明显的缺点&#xff0c;那就是一旦JS代码逻辑发生了更改&#xff0c;你就得重写Python的代码逻辑非常不便。于是第二种情况就出现了&#xff0c;我直接得到…

python自动化管理和zabbix监控网络设备(防火墙和python自动化配置部分)

目录 前言 一、ssh配置 1.FW1 2.core-sw1 3.core-sw2 二、python自动化配置防火墙 三、验证DNAT 四、验证DNAT 前言 视频演示请访问b站主页 白帽小丑的个人空间-白帽小丑个人主页-哔哩哔哩视频 一、ssh配置 给需要自动化管理的设备配置ssh服务端用户名和密码 1.FW1 …