python非递归前序遍历二叉树_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]

非递归实现二叉树的三种遍历操作,C++描述

body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

c++实现二叉树层序、前序创建二叉树,递归非递归实现二叉树遍历

#include #include #include #include # ...

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 { BinaryNode 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 ...

随机推荐

QT插件使用

1基本插件制作流程 1) 定义接口.接口定义为抽象基类,如IPluginInterface,实现高度封装.定义的头文件在最后需要通过Q_DECLARE_INTERFACE来唯一标识该接口,即通过一个全 ...

django学习の模型

orm:对象数据库和模型的映射.如果想以简单的方式去操作数据库,例如用类的方式去操作,就像 p = Person.get(id = 1),那么就必须使得代码和数据库的结构具有映射关系,实现这种关系,你 ...

Android中如何实现多行、水平滚动的分页的Gridview?

功能要求: (1)比如每页显示2X2,总共2XN,每个item显示图片+文字(点击有链接). 如果单行水平滚动,可以用Horizontalscrollview实现. 如果是多行水平滚动,则结合Grid ...

[转]C++ list 类学习笔记

双向循环链表list list是双向循环链表,,每一个元素都知道前面一个元素和后面一个元素.在STL中,list和vector一样,是两个常被使用的容器.和vector不一样的是,list不支持对元素 ...

高效操作DOM

DOM树与Render树 这个应该都是知道的.就是用户请求HTML下来后,浏览器渲染引擎的基本工作中两个概念. copy一张图,流程大概就是:解析html构建DOM树,渲染树构建,渲染树布局,绘制渲染 ...

vtk基础编程(2)-读取数据文件中的坐标点

你可能感兴趣的:(python非递归前序遍历二叉树_Python非递归实现二叉树的后续遍历)