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. python中的数据存储认识

    声明:本人是一个初学者,博客内容基本也是一些基础的东西,如果说的有什么问题欢迎纠正. 前言 许多人初学python之前应该也学习过其他的语言,比如博大精深的c语言,笔者在学习python之前就学习过c ...

  2. Jmeter(五) - 从入门到精通 - 创建网络计划实战和创建高级Web测试计划(详解教程)

    1.简介 上一篇中宏哥已经将其的理论知识介绍了一下,这一篇宏哥就带着大家一步一步的把上一篇介绍的理论知识实践一下,然后再说一下如何创建高级web测试计划. 2.网络计划实战 通过上一篇的学习,宏哥将其 ...

  3. jchdl - GSL实例 - DLatch(D锁存器)

    https://mp.weixin.qq.com/s/c8kDgye50nKJR4tkC0RzVA D锁存器对电平敏感,当使能位使能时,输出Q跟随输入D的变化而变化.   ​​ 摘自康华光<电子 ...

  4. Python编程思想(3):数字及其相关运算

    Python 提供了三种数值类型:int(整型),float(浮点型)和complex(复数). int:通常被称为整型或者整数,如200.299.10都属于整型: float:浮点数包含整数和小数部 ...

  5. 【HIVE】(1)建表、导入数据、外部表、导出数据

    导入数据 1). 本地 load data local inpath "/root/example/hive/data/dept.txt" into table dept; 2). ...

  6. 第六届蓝桥杯JavaC组省赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.隔行变色 隔行变色 Excel表的格子很多,为了避免把某行的数据和相邻行混淆,可以采用隔行变色的样式. 小明设计的样式为:第1行蓝色, ...

  7. java实现第七届蓝桥杯压缩变换

    压缩变换 压缩变换 小明最近在研究压缩算法. 他知道,压缩的时候如果能够使得数值很小,就能通过熵编码得到较高的压缩比. 然而,要使数值很小是一个挑战. 最近,小明需要压缩一些正整数的序列,这些序列的特 ...

  8. 获取Google浏览器保存的密码

    获取Google中保存的密码 直接在浏览器上输入 chrome://settings/passwords

  9. 数据结构与算法-python描述-单链表

    # coding:utf-8 # 单链表的相关操作: # is_empty() 链表是否为空 # length() 链表长度 # travel() 遍历整个链表 # add(item) 链表头部添加元 ...

  10. 第一章04-Activity中常用的标志位

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