[leetcode][JAVA]面试题第[1028]题[迭代]

【问题描述】[困难]

我们从二叉树的根节点 root 开始进行深度优先搜索。

在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。

如果节点只有一个子节点,那么保证该子节点为左子节点。

给出遍历输出 S,还原树并返回其根节点 root。

示例 1:
在这里插入图片描述
输入:“1-2–3--4-5–6--7”
输出:[1,2,5,3,4,6,7]
示例 2:

在这里插入图片描述

输入:“1-2–3—4-5–6—7”
输出:[1,2,5,3,null,6,null,4,null,7]
示例 3:

在这里插入图片描述

输入:“1-401–349—90–88”
输出:[1,401,null,349,88,90]

提示:

原始树中的节点数介于 1 和 1000 之间。
每个节点的值介于 1 和 10 ^ 9 之间。

【解答思路】

迭代方法(模拟递归)

在这里插入图片描述
在这里插入图片描述
时间复杂度:O(N) 空间复杂度:O(N)

public TreeNode recoverFromPreorder(String S) {Deque<TreeNode> path = new LinkedList<TreeNode>();int pos = 0;while(pos < S.length()){int level = 0;// 数-while (S.charAt(pos) == '-') {++level;++pos;}//算数 int value =0 ;while(pos < S.length() && Character.isDigit(S.charAt(pos)) ){value = value*10 +(S.charAt(pos)-'0');++pos;}TreeNode node  =new TreeNode(value);//左节点if(level == path.size()){if(!path.isEmpty()){path.peek().left =node;    }}else{//找右节点while(level!=path.size()){path.pop();}path.peek().right =node; }path.push(node);}while(path.size()>1){path.pop();}return path.peek();}

【总结】

1.题解里写了「迭代」而不是「递归」的方法。其实可以发现,如果我们用「递归」来实现本题的话,必须也要用到一些全局变量来维护例如「当前遍历到字符串的哪个位置」「下一个节点的深度」这类的信息。这样给我的感觉就像是「在递归的模板上套了一些递归没有办法做的事情」。既然如此的话,我们不如就将递归直接改写成迭代的形式,每次添加一个新节点的时候,就将一些节点从我们自己维护的栈中弹出,将「用栈来遍历树」和「用全局变量实时维护信息」这两者统一起来。
2.以链表组的头一个作为答案的思路有点妙

Deque path = new LinkedList();

3. 栈

pop() 出
peek() 栈顶
push() 入

转载链接:https://leetcode-cn.com/problems/recover-a-tree-from-preorder-traversal/solution/cong-xian-xu-bian-li-huan-yuan-er-cha-shu-by-leetc/

参考链接:https://leetcode-cn.com/problems/recover-a-tree-from-preorder-traversal/solution/shou-hui-tu-jie-fei-di-gui-fa-zhong-gou-chu-er-cha/

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

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

相关文章

HDU-5023 线段树染色问题+延时标记

题意 给我们1-n的区间段 两种操作 P a b c 表示把a到b染成c颜色 Q a b 表示求a到b的颜色种类数量 注意初始全部先染成颜色2 分析 线段树经典染色问题 可以用二进制来表示颜色数量 一共30个颜色 那么最多也就是30位 不会超过int的范围 二进制下第x位为1表示有x1的颜色 …

频率域锐化滤波器

频率域锐化滤波器 &#xff08;Frequency Sharpening Filters &#xff09; 图像的边缘、细节主要位于高频部分&#xff0c;而图 像的模糊是由于高频成分比较弱产生的。 频率域锐化就是为了消除模糊&#xff0c;突出边缘。 采用高通滤波器让高频成分通过&#xff0c;使低频成 …

1033 旧键盘打字

旧键盘上坏了几个键&#xff0c;于是在敲一段文字的时候&#xff0c;对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键&#xff0c;打出的结果文字会是怎样&#xff1f; 输入格式&#xff1a; 输入在 2 行中分别给出坏掉的那些键、以及应该输入的文字。其中…

Node js redis

const redis require(redis);//redis const client redis.createClient(8888, 172.16.4.2); //redis操作client.set("hello", "{\"a\":\"1\", \"b\":\"2\"}") client.get("hello", function(err, val…

6用NetBeans进行JSP开发

用NetBeans进行JSP开发 NetBeans

关于GCD的证明

关于GCD欧几里得算法的证明过程&#xff1a; 证明一&#xff1a; 有两个数 a b 设这两个数的gcd(a,b) g 那么假设其中比较大的数 a a k*b r; 那么当我们对a求对b的最大公约数时 如果没有余数r 那么gcd 就等于b 那么现在有r了 所以gcd 的取值就取决于r了 因为现在我们…

Java学习笔记12——JVM入门

文章目录JVM简介和体系结构JVM的位置JVM的体系结构类加载器双亲委派机制沙箱安全机制&#xff08;了解即可&#xff09;NativePC寄存器方法区栈三种JVM堆新生区永久区堆内存调优Jprofiler的使用GC&#xff08;垃圾回收&#xff09;引用计数法复制算法标记清除法标记压缩法GC算法…

[Leedcode][JAVA][第125题][验证回文串][双指针][String]

【问题描述】[简单] 给定一个字符串&#xff0c;验证它是否是回文串&#xff0c;只考虑字母和数字字符&#xff0c;可以忽略字母的大小写。说明&#xff1a;本题中&#xff0c;我们将空字符串定义为有效的回文串。示例 1:输入: "A man, a plan, a canal: Panama" 输…

面向对象之:继承

一&#xff1a;什么面向对象的继承&#xff1f; 比较官方的说法就是&#xff1a; 继承&#xff08;英语&#xff1a;inheritance&#xff09;是面向对象软件技术当中的一个概念。如果一个类别A“继承自”另一个类别B&#xff0c;就把这个A称为“B的子类别”&#xff0c;而…

7用Eclipse进行JSP开发

用Eclipse进行JSP开发 Eclipse简介和下载 Eclipse的发展 什么是Eclipse Eclipse下载 用Eclipse进行JSP开发 软件环境配置 安装JDK&#xff0c;配置Java运行环境 安装Tomcat服务器&#xff08;服务器能够正常启动和关闭&#xff09; 安装Eclipse JSP开发

求递归算法时间复杂度:递归树

引用自&#xff1a;http://www.cnblogs.com/wu8685/archive/2010/12/21/1912347.html 递归算法时间复杂度的计算方程式一个递归方程&#xff1a; 在引入递归树之前可以考虑一个例子&#xff1a; T(n) 2T(n/2) n2 迭代2次可以得&#xff1a; T(n) n2 2(2T(n/4) (n/2) 2) 还…

[Leetcode][JAVA]第[29]题[两数相除][二分法]

【问题描述】[中等] 给定两个整数&#xff0c;被除数 dividend 和除数 divisor。将两数相除&#xff0c;要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。整数除法的结果应当截去&#xff08;truncate&#xff09;其小数部分&#xff0c;…

8.用MyEclipse进行JSP开发

用MyEclipse进行JSP开发

Hihocoer 1336 - Matrix Sum 二维树状数组

题意 给我们个n*n的矩阵 有m个操作让我们 操作有两种 Add x y v对(x,y)上的元素加v Sum x1 y1 x2 y2 对(x1,y1)为左上角(x2,y2)为右下角的矩阵求和并mod 1e97 初始矩阵每个元素都是0 1 ≤ N ≤ 1000, 1 ≤ M ≤ 100000 For each Add operation: 0 ≤ x < N, 0 ≤ y < N…

Java学习笔记13-1——SpringMVC

文章目录1.什么是MVC回顾Servlet2.什么是SpringMVC概述中心控制器SpringMVC执行原理3.第一个SpringMVC 程序使用XML配置实现使用注解实现4.控制器和RestFul风格控制器Controller实现Controller接口使用注解ControllerRequestMappingRestFul 风格扩展&#xff1a;小黄鸭调试法5.…

端口占用怎么查找

D:\Users\hp\Documents\NetBeansProjects\WebApplication1\nbproject\build-impl.xml:1030: Deployment error: Starting of Tomcat failed, the server port 8080 is already in use. netstat -aon|findstr "8080" 查看端口 查看端口的进程 记住3306 tasklist|fi…

数据库相关

https://blog.csdn.net/qq_35246620/article/details/70823903 瞻仰大佬的博客,,学习学习 转载于:https://www.cnblogs.com/wangxiaoshou/p/10483428.html

eclipse没有server怎么办

1打开eclipse 找到help 2点开&#xff0c;查找 Install new software 二步、然后在Work with中点击Add&#xff0c;如下图所示&#xff0c;加入Name"Kepler" repository&#xff1b;Locationhttp://download.eclipse.org/releases/kepler。 3填写完成后使用add 4第…

HDU - 5441 Travel 离线处理+并查集

题意 给我们一个图 给出这个图的n个点 和m个边和权值 然后再分别给我们q个查询 每个查询给一个x 让我们在这个图中找出多少个不同的有序对 使得从x到y的最大权值不超过x n≤20000,m≤100000,q≤5000. 分析 20000个点 1000ms 暴力肯定不行 看似这道题像是个图论的题 嘿嘿嘿 其…

zabbix利用SNMPTrap接收交换机主动告警

zabbix接收trap的工作流程&#xff1a; snmptrapd 收到trapsnmptrapd将trap传递给SNMPTT或调用Perl接收器SNMPTT或Perl trap接收器解析&#xff0c;格式化并将trap写入文件Zabbix SNMP trap读取并解析trap文件对于每个trap&#xff0c;Zabbix发现主机接口与接收的trap地址匹配的…