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 )

一次遍历得出最终树的head 
 

代码

```python3
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]

  

### 案例1的打印情况 方便理解具体栈内部情况

# 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%内存 一次遍历的更多相关文章

  1. SDUT OJ 数据结构实验之二叉树四:(先序中序)还原二叉树

    数据结构实验之二叉树四:(先序中序)还原二叉树 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem ...

  2. SDUT-3343_数据结构实验之二叉树四:(先序中序)还原二叉树

    数据结构实验之二叉树四:(先序中序)还原二叉树 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 给定一棵二叉树的先序遍历 ...

  3. 利用层序遍历(含空节点)和中序遍历重建二叉树 python

    给定一颗二叉树的层序遍历(不含None的形式)和中序遍历序列,利用两个序列完成对二叉树的重建. 还是通过一个例子来说明整个过程,下图所示的二叉树,层序遍历结果为[a,b,c,d,e],中序遍历结果为[ ...

  4. UVA 548.Tree-fgets()函数读入字符串+二叉树(中序+后序遍历还原二叉树)+DFS or BFS(二叉树路径最小值并且相同路径值叶子节点权值最小)

    Tree UVA - 548 题意就是多次读入两个序列,第一个是中序遍历的,第二个是后序遍历的.还原二叉树,然后从根节点走到叶子节点,找路径权值和最小的,如果有相同权值的就找叶子节点权值最小的. 最后 ...

  5. [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 ...

  6. [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 ...

  7. 【leetcode 968. 1028. 从先序遍历还原二叉树】解题报告[待完善...]

    思路:用一个栈来管理树的层次关系,索引代表节点的深度 方法一: TreeNode* recoverFromPreorder(string S) { /* 由题意知,最上层节点深度为0(数字前面0条横线 ...

  8. Java由先序序列和中序序列还原二叉树

    还原本来的二叉树并不是一个非常简单的事,虽然思想比较简单,但过程却是比较繁琐.下面我拿先序序列和中序序列来讲一下原理吧. 从先序序列中我们一下子就可以得到二叉树的根节点是第一个元素,然后再中序序列中我 ...

  9. 数据结构实验之二叉树四:(先序中序)还原二叉树 (SDUT 3343)

    #include <bits/stdc++.h> using namespace std; struct node { char data; struct node *lc, *rc; } ...

随机推荐

  1. 01 . 分布式存储之FastDFS简介及部署

    分布式存储简介 现代的互联网已经进入大数据时代,每天都有数以万计的数据产生,这些数据的规模轻轻松松地可以达到几P的级别,传统的的单机存储早已捉襟见肘,根本无法满足大数据对存储系统的要求.这时,各种分布 ...

  2. 09 . Python3之常用模块

    模块的定义与分类 模块是什么? 一个函数封装一个功能,你使用的软件可能就是由n多个函数组成的(先备考虑面向对象).比如抖音这个软件,不可能将所有程序都写入一个文件,所以咱们应该将文件划分,这样其组织结 ...

  3. prism.js——让网页中的代码更好看

    粗放的代码展示 有时候,网页中会插入代码.直接把代码放入<pre></pre>标签和<code></code>标签里,也算是可以在页面中显示出来. 比如 ...

  4. Java 第十一届 蓝桥杯 省模拟赛 正整数的摆动序列

    正整数的摆动序列 问题描述 如果一个序列的奇数项都比前一项大,偶数项都比前一项小,则称为一个摆动序列.即 a[2i]<a[2i-1], a[2i+1]>a[2i]. 小明想知道,长度为 m ...

  5. Java实现 LeetCode 95 不同的二叉搜索树 II(二)

    95. 不同的二叉搜索树 II 给定一个整数 n,生成所有由 1 - n 为节点所组成的二叉搜索树. 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1, ...

  6. java实现第二届蓝桥杯地铁换乘(C++)

    地铁换乘. 为解决交通难题,某城市修建了若干条交错的地铁线路,线路名及其所属站名如stations.txt所示. 线1 苹果园 .... 四惠东 线2 西直门 车公庄 .... 建国门 线4 .... ...

  7. java实现第四届蓝桥杯金蝉素数

    金蝉素数 考古发现某古墓石碑上刻着一个数字:13597,后研究发现: 这是一个素数! 并且,去掉首尾数字仍是素数! 并且,最中间的数字也是素数! 这样特征的数字还有哪些呢?通过以下程序的帮助可以轻松解 ...

  8. java实现第六届蓝桥杯空心菱形

    空心菱形 标题:空心菱形 小明刚刚开发了一个小程序,可以打印出任意规模的空心菱形,规模为6时,如下图: ****** ****** ***** ***** **** **** *** *** ** * ...

  9. swagger--Failed to load API definition.

    打开 http://localhost:5000/swagger/v1/swagger.json 提示错误 An unhandled exception occurred while processi ...

  10. 第一章03-Activity的启动模式

    Activity的LaunchMode Android中提供了四中Activity的启动模式 1. standard 2. singleTop 3. singleTask 4. signleInsta ...