leetcode1028 从先序遍历还原二叉树 python 100%内存 一次遍历
1028. 从先序遍历还原二叉树 python 100%内存 一次遍历
题目
我们从二叉树的根节点 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 之间。
解题思路
在for循环字符串的过程中 使用了 4个变量 returnlist 作为栈容器 index作为当前位置索引 , level作为当前节点层级,val记录当前node的值 (注意要凑出当val 不为10以内的情况时 使用10进制的拼接来做 val )
代码
class Solution:
def recoverFromPreorder(self, S: str) -> TreeNode:
returnlist = [] #returnlist 作为栈容器
index = 0 #index作为当前位置索引
level = 0 # level作为当前节点层级
val = 0 # val记录当前node的值 (注意当val>10的情况时 使用10进制的拼接来得出真实val )
for i in S:
if i == "-": # 判断当前位置
index += 1
level += 1
else:
index += 1
if index<len(S) and S[index].isdigit(): # 判断当前的i 对象下一个是否也是数字 ,是就进行拼接,并跳过当前循环 ,保持住当前level 不变
val = int(i) + val*10
continue
val = int(i) + val*10 #总能得到真实val的值
node = TreeNode(val) #生成node节点对象 ----
val = 0
if level == 0: #首节点
returnlist.append(node)
else: #非首节点
if level == len(returnlist): #根据题意 只能 树的左分支有值 所以 直接判断 当前层级与树层级 将最左边的树的那一分支 先构建出来
returnlist[-1].left = node
else:
returnlist = returnlist[:level] #所有不是最左分支的节点 根据自己的层级 做判断 取出当前栈中 所属层级的最后一位 (因为题目是二叉树所以这样取没问题,如果非二叉树就复杂了)
returnlist[-1].right = node
returnlist.append(node) # 节点入栈
level = 0 #入栈后重新开始 level 计数
# print('val >>',val,'i >>',i,'level >>', level,'len >>'len(returnlist), returnlist) #打印结果如下示例
return returnlist[0]
# print('val >>',val,'i >>',i,'level >>', level,'len >>'len(returnlist), returnlist) #打印结果如下示例
输入值为"1-2--3--4-5--6--7" 输入值 字符串 S为 目的是还原为 如下树结构
输出:head 广度优先 表示为 >> [1,2,5,3,4,6,7]
val> 0 i> 1 level> 0 len> 1 [TreeNode{val: 1, left: None, right: None}]
val> 0 i> 2 level> 0 len> 2 [TreeNode{val: 1, left: TreeNode{val: 2, left: None, right: None}, right: None}, TreeNode{val: 2, left: None, right: None}]
val> 0 i> 3 level> 0 len> 3 [TreeNode{val: 1, left: TreeNode{val: 2, left: TreeNode{val: 3, left: None, right: None}, right: None}, right: None}, TreeNode{val: 2, left: TreeNode{val: 3, left: None, right: None}, right: None}, TreeNode{val: 3, left: None, right: None}]
val> 0 i> 4 level> 0 len> 3 [TreeNode{val: 1, left: TreeNode{val: 2, left: TreeNode{val: 3, left: None, right: None}, right: TreeNode{val: 4, left: None, right: None}}, right: None}, TreeNode{val: 2, left: TreeNode{val: 3, left: None, right: None}, right: TreeNode{val: 4, left: None, right: None}}, TreeNode{val: 4, left: None, right: None}]
val> 0 i> 5 level> 0 len> 2 [TreeNode{val: 1, left: TreeNode{val: 2, left: TreeNode{val: 3, left: None, right: None}, right: TreeNode{val: 4, left: None, right: None}}, right: TreeNode{val: 5, left: None, right: None}}, TreeNode{val: 5, left: None, right: None}]
val> 0 i> 6 level> 0 len> 3 [TreeNode{val: 1, left: TreeNode{val: 2, left: TreeNode{val: 3, left: None, right: None}, right: TreeNode{val: 4, left: None, right: None}}, right: TreeNode{val: 5, left: TreeNode{val: 6, left: None, right: None}, right: None}}, TreeNode{val: 5, left: TreeNode{val: 6, left: None, right: None}, right: None}, TreeNode{val: 6, left: None, right: None}]
val> 0 i> 7 level> 0 len> 3 [TreeNode{val: 1, left: TreeNode{val: 2, left: TreeNode{val: 3, left: None, right: None}, right: TreeNode{val: 4, left: None, right: None}}, right: TreeNode{val: 5, left: TreeNode{val: 6, left: None, right: None}, right: TreeNode{val: 7, left: None, right: None}}}, TreeNode{val: 5, left: TreeNode{val: 6, left: None, right: None}, right: TreeNode{val: 7, left: None, right: None}}, TreeNode{val: 7, left: None, right: None}]
leetcode1028 从先序遍历还原二叉树 python 100%内存 一次遍历的更多相关文章
- SDUT OJ 数据结构实验之二叉树四:(先序中序)还原二叉树
数据结构实验之二叉树四:(先序中序)还原二叉树 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem ...
- SDUT-3343_数据结构实验之二叉树四:(先序中序)还原二叉树
数据结构实验之二叉树四:(先序中序)还原二叉树 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定一棵二叉树的先序遍历 ...
- 利用层序遍历(含空节点)和中序遍历重建二叉树 python
给定一颗二叉树的层序遍历(不含None的形式)和中序遍历序列,利用两个序列完成对二叉树的重建. 还是通过一个例子来说明整个过程,下图所示的二叉树,层序遍历结果为[a,b,c,d,e],中序遍历结果为[ ...
- UVA 548.Tree-fgets()函数读入字符串+二叉树(中序+后序遍历还原二叉树)+DFS or BFS(二叉树路径最小值并且相同路径值叶子节点权值最小)
Tree UVA - 548 题意就是多次读入两个序列,第一个是中序遍历的,第二个是后序遍历的.还原二叉树,然后从根节点走到叶子节点,找路径权值和最小的,如果有相同权值的就找叶子节点权值最小的. 最后 ...
- [Swift]LeetCode1028. 从先序遍历还原二叉树 | Recover a Tree From Preorder Traversal
We run a preorder depth first search on the root of a binary tree. At each node in this traversal, w ...
- [LeetCode] 1028. Recover a Tree From Preorder Traversal 从先序遍历还原二叉树
We run a preorder depth first search on the rootof a binary tree. At each node in this traversal, we ...
- 【leetcode 968. 1028. 从先序遍历还原二叉树】解题报告[待完善...]
思路:用一个栈来管理树的层次关系,索引代表节点的深度 方法一: TreeNode* recoverFromPreorder(string S) { /* 由题意知,最上层节点深度为0(数字前面0条横线 ...
- Java由先序序列和中序序列还原二叉树
还原本来的二叉树并不是一个非常简单的事,虽然思想比较简单,但过程却是比较繁琐.下面我拿先序序列和中序序列来讲一下原理吧. 从先序序列中我们一下子就可以得到二叉树的根节点是第一个元素,然后再中序序列中我 ...
- 数据结构实验之二叉树四:(先序中序)还原二叉树 (SDUT 3343)
#include <bits/stdc++.h> using namespace std; struct node { char data; struct node *lc, *rc; } ...
随机推荐
- 01 . 分布式存储之FastDFS简介及部署
分布式存储简介 现代的互联网已经进入大数据时代,每天都有数以万计的数据产生,这些数据的规模轻轻松松地可以达到几P的级别,传统的的单机存储早已捉襟见肘,根本无法满足大数据对存储系统的要求.这时,各种分布 ...
- 09 . Python3之常用模块
模块的定义与分类 模块是什么? 一个函数封装一个功能,你使用的软件可能就是由n多个函数组成的(先备考虑面向对象).比如抖音这个软件,不可能将所有程序都写入一个文件,所以咱们应该将文件划分,这样其组织结 ...
- prism.js——让网页中的代码更好看
粗放的代码展示 有时候,网页中会插入代码.直接把代码放入<pre></pre>标签和<code></code>标签里,也算是可以在页面中显示出来. 比如 ...
- Java 第十一届 蓝桥杯 省模拟赛 正整数的摆动序列
正整数的摆动序列 问题描述 如果一个序列的奇数项都比前一项大,偶数项都比前一项小,则称为一个摆动序列.即 a[2i]<a[2i-1], a[2i+1]>a[2i]. 小明想知道,长度为 m ...
- Java实现 LeetCode 95 不同的二叉搜索树 II(二)
95. 不同的二叉搜索树 II 给定一个整数 n,生成所有由 1 - n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1, ...
- java实现第二届蓝桥杯地铁换乘(C++)
地铁换乘. 为解决交通难题,某城市修建了若干条交错的地铁线路,线路名及其所属站名如stations.txt所示. 线1 苹果园 .... 四惠东 线2 西直门 车公庄 .... 建国门 线4 .... ...
- java实现第四届蓝桥杯金蝉素数
金蝉素数 考古发现某古墓石碑上刻着一个数字:13597,后研究发现: 这是一个素数! 并且,去掉首尾数字仍是素数! 并且,最中间的数字也是素数! 这样特征的数字还有哪些呢?通过以下程序的帮助可以轻松解 ...
- java实现第六届蓝桥杯空心菱形
空心菱形 标题:空心菱形 小明刚刚开发了一个小程序,可以打印出任意规模的空心菱形,规模为6时,如下图: ****** ****** ***** ***** **** **** *** *** ** * ...
- swagger--Failed to load API definition.
打开 http://localhost:5000/swagger/v1/swagger.json 提示错误 An unhandled exception occurred while processi ...
- 第一章03-Activity的启动模式
Activity的LaunchMode Android中提供了四中Activity的启动模式 1. standard 2. singleTop 3. singleTask 4. signleInsta ...