后序遍历的非递归算法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]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值