Python非递归实现二叉树的后续遍历
leetcode 145. Binary Tree Postorder Traversal
思路一:
- 使用一个栈stack保存经过的根结点,另一个栈flag保存每个结点的右子树是否遍历;
- 如果根结点存在,结点入栈,并把结点的右子树遍历结果置为0,代表没遍历;
- 把root指向左子树;
- 如果栈不为空,判断栈顶元素右子树是否存在以及是否已经遍历,如果存在并且没有遍历,则把root指向右子树;否则,结点出栈,并且把结点的右子树遍历标志出栈;
- 重复2-4直到栈空或者root不存在。
这是第一个一下想到的思路,可以看到用了两个栈作为额外的空间,复杂度不是很好,并且在leetcode上提交后,运行时间感觉也不甚理想,有没有更好的方法呢?
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def postorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
ret = []
stack = []
flag = []
while root or stack:
while root:
stack.append(root)
flag.append(0)
root = root.left
if stack:
top = stack[-1]
if top.right and not flag[-1]:
flag[-1] = 1
root = top.right
else:
flag.pop()
ret.append(stack.pop().val)
return ret
感觉在学校时接触的第一门语言是C,数据结构也是基于C学的,导致第一印象总是往上面靠,写出来的代码不是很Pythonic,下面是一个我觉得更好的,代码更少,也更容易理解的方法。
思路二:
后续遍历根结点,先遍历左子树,然后遍历右子树,此时反过来考虑:先遍历根结点,然后遍历右子树,最后是左子树,这样就可以转化为和先序遍历一个类型了,最后只把遍历结果逆序输出就ok了,而先序遍历是之前写过并且比较好理解的。
- 使用栈存储结点;
- 当结点存在或者栈不为空,判断结点;
- 当结点存在,结点值保存,结点入栈,并将指针指向结点的右子树;
- 当栈不为空,结点出栈,并将指针指向左子树;
- 重复2-4直到结果产生;
- 逆序输出结果,利用Python列表的-1.
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def postorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
ret = []
stack = []
while root or stack:
while root:
ret.append(root.val)
stack.append(root)
root = root.right
if stack:
top = stack.pop()
root = top.left
return ret[::-1]
Python非递归实现二叉树的后续遍历的更多相关文章
- 非递归实现二叉树的三种遍历操作,C++描述
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- c++实现二叉树层序、前序创建二叉树,递归非递归实现二叉树遍历
#include <iostream> #include <cstdio> #include <stdio.h> #include <string> # ...
- Python 非递归遍历图
class Queue: def __init__(self,max_size): self.max_size = int(max_size) self.queue = [] def put(self ...
- 非递归创建二叉树( C++队列 )
非递归按照 层序 创建二叉树,利用 队列(即可先进先出特点)存放已访问的结点元素的地址. 初始化:front=rear= -1: 每储存一个结点元素 rear+1 ,利用 rear%2==0 来使 f ...
- python非递归全排列
刚刚开始学习python,按照廖雪峰的网站看的,当前看到了函数这一节.结合数组操作,写了个非递归的全排列生成.原理是插入法,也就是在一个有n个元素的已有排列中,后加入的元素,依次在前,中,后的每一个位 ...
- Java 非递归实现 二叉树的前中后遍历以及层级遍历
class MyBinaryTree<T> { BinaryNode<T> root; public MyBinaryTree() { root = new BinaryNod ...
- Python非递归遍历多叉树
class Queue: def __init__(self,max_size): self.max_size = int(max_size) self.queue = [] def put(self ...
- python数据结构与算法——二叉树结构与遍历方法
先序遍历,中序遍历,后序遍历 ,区别在于三条核心语句的位置 层序遍历 采用队列的遍历操作第一次访问根,在访问根的左孩子,接着访问根的有孩子,然后下一层 自左向右一一访问同层的结点 # 先序遍历 # ...
- 递归/非递归----python深度遍历二叉树(前序遍历,中序遍历,后序遍历)
递归代码:递归实现很简单 '二叉树结点类' class TreeNode: def __init__(self, x): self.val = x self.left = None self.righ ...
随机推荐
- 【luoguP1840】 Color the Axis_NOI导刊2011提高(05)
题目描述 在一条数轴上有N个点,分别是1—N.一开始所有的点都被染成黑色.接着我们进行M次操作,第i次操作将[Li,Ri]这些点染成白色.请输出每个操作执行后剩余黑色点的个数. 输入格式 输入一行为N ...
- cmake 学习-cmakelists.txt
#设置库的路径,电脑里有qt4以及qt5,使用qt5时 设置qt5的环境变量(路径). set(CMAKE_PREFIX_PATH $ENV{QTDIR}) #设定工程名称 Project(prona ...
- C语言学习笔记11- 文件I/O
C语言学习笔记11- 文件I/O ..待编辑 文件操作(CRT.C++.WIN API.MFC)
- linux密码忘记的处理步骤
linux忘记密码 centos7忘记密码如何解决?进入到单用户模式下去修改root密码step 1:开机时按住向下箭头,选择第一个,按住e进入gurb界面:step 2:在编辑模式下找ro 修改为 ...
- Sketch教程
去年夏天开始用Sketch,觉得它放Dock里闪亮亮的很好看,当时笑称是男盆友送我的第一颗小钻石噗哈哈.所以那段时间几乎刷遍了所有关于 Sketch 的网站.文章.教程,之后又在自学设计,因为想和更多 ...
- SQL-W3School-高级:SQL 通配符
ylbtech-SQL-W3School-高级:SQL 通配符 1.返回顶部 1. 在搜索数据库中的数据时,您可以使用 SQL 通配符. SQL 通配符 在搜索数据库中的数据时,SQL 通配符可以替代 ...
- python小白之字典使用笔记
Python 字典(Dictionary) 字典是一种可变容器模型,且可存储任意类型对象. 每个键值 key=>value 对,用冒号 : 分割 每个键值对之间用逗号 , 分割 整个字典包括 ...
- 在DELPHI中用TreeView控件从数据库中动态装载信息
1.PInfo表结构ID VARCHAR(50)FullName VARCHAR(50)ParentID VARCHAR(50) 2.Unit文件unit Info; interface uses ...
- Spring Aop(十四)——Aop自动创建代理对象的原理
转发地址:https://www.iteye.com/blog/elim-2398725 Aop自动创建代理对象的原理 我们在使用Spring Aop时,通常Spring会自动为我们创建目标bean的 ...
- sonar汉化