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 ...
随机推荐
- WEB自动化测试(UFT与Selenium)课程及视频教程
自动化测试UFT与Selenium详细视频教程科目如下: 1.自动化测试基础-2.UFT自动化测试详解-3.UFT高级测试开发-4.自动化测试框架设计-5.UFT综合实战-6自动化测试-Seleniu ...
- spring相关知识点易错
1.spring不支持静态变量注入,即不能再static变量上面加@Resoure 要是想注入的话就用set方法注入 private static ComboPooledDataSource pool ...
- MySQL查询top N记录
下面以查询每门课程分数最高的学生以及成绩为例,演示如何查询 top N记录.下图是测试数据,表结构和相关 insert 脚本见<常用SQL之日期格式化和查询重复数据>. 使用自连接[推荐] ...
- 微信小程序之简单记账本开发记录(三)
昨天已经编辑了主界面,在wxml文件中设置好跳转链接之后,就可以进行下一步的开发了 在pages中建立一个新的页面文件夹作为之后的支出页面 编辑后台,今天先搭建大致界面
- Flask-login 原理
1 login_required 内部原理,主要是判断当前用户是否已经授权访问,如果没被授权就调用current_app.login_manager.unauthorized() current_us ...
- ArcGIS超级工具SPTOOLS-SHP转数据库,批量数据库转数据库,栅格彩色转黑白
1.1 SHP转数据库 把一个文件夹的数据,转到数据库,或者另一个文件夹,不含字文件夹 1.2 批量数据库转数据库 把一个文件夹下GDB或者MDB,转到另一个文件夹为MDB,GDB,并实现版本的转 ...
- Js 实现页面缩放
分享一个很棒的东西::::: 优点:不用考虑适配问题,按设计稿进行固定尺寸开发. 1.将下面这段 js 放在页面的<head>中 function bodyScale() { var de ...
- P2308 添加括号
P2308 添加括号 题解 一看这题---我能AC 看完这题---我要换题 这题第二问其实就是一个链的石子合并,也就是不用处理环 所以一三问怎么处理??? 数组 mid[ i ][ j ] 记录区间 ...
- kotlin中值范围
值范围表达式用rangeTo函数,该函数的操作符形式是二个点(..)另外还有in 和!in 相关操作符,任何可比较的大小的数据类型都可以定义值范围 值范围应用 fun main(arg: Array& ...
- Servlet的入门案例
编写入门案例 1)编写java类,继承HttpServlet类 2)重新doGet和doPost方法 3)Servlet程序交给tomcat服务器运行!! 3.1 servlet程序的class码拷贝 ...