leetcode-145 | 二叉树的后序遍历

title: leetcode-145 | 二叉树的后序遍历
date: 2019-7-28 15:13:38
comments: true
categories: “leetcode”
tags:
- leetcode 困难难度
- 栈
- 二叉树的遍历

题目描述

给定一个二叉树,返回它的 后序 遍历。

示例:

输入: [1,null,2,3]
1
  \
      2
  /
3
输出: [1,3,2]

思路解答

递归方式

先序遍历:根左右
中序遍历:左根右
后序遍历:左右根

# 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 __init__(self):
        self.resu = []
    def postorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if root:
            self.postorderTraversal(root.left)
            self.postorderTraversal(root.right)
            self.resu.append(root.val)
            
        return self.resu
        

运行结果

执行用时 : 32 ms, 在Remove Nth Node From End of List的Python提交中击败了26.67% 的用户
内存消耗 : 11.8 MB, 在Remove Nth Node From End of List的Python提交中击败了25.12% 的用户

提交时间状态执行用时内存消耗语言
几秒前通过32 ms11.8 MBpython

模拟系统栈

后序遍历:左右根
也即是:

self.postorderTraversal(root.left)
self.postorderTraversal(root.right)
self.resu.append(root.val)

那么我们使用栈模拟依次压栈的顺序就是:根右左

class Solution(object):
    def __init__(self):
        self.resu = []
    def postorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if root is None:
            return []
        stack = [('go', root)]
        # 后序: 左 右 根 访问  =》 压栈顺序: 根 右  左
        while len(stack):
            # 取栈顶元素
            ele = stack.pop()
            # 逻辑
            if ele[0] == 'print':
                self.resu.append(ele[1].val)
            else:
                stack.append(('print', ele[1]))  # 根
                if ele[1].right:                    # 右
                    stack.append(('go', ele[1].right))
                if ele[1].left:                    # 左
                    stack.append(('go', ele[1].left))


        return self.resu

运行结果

执行用时 : 28 ms, 在Remove Nth Node From End of List的Python提交中击败了47.42% 的用户
内存消耗 : 11.6 MB, 在Remove Nth Node From End of List的Python提交中击败了40.55% 的用户

提交时间状态执行用时内存消耗语言
几秒前通过28 ms11.6 MBpython

参考我的CSDN博客:地址
在这里插入图片描述
先序序列: 1 、2 、3 、5 、4
后序序列:3 、5、2 、4 、1
把后续序列逆序得,逆后序序列:1 、4 、2 、5 、3
观察,逆后序列和先序序列有一定联系,逆序后的序列可以看做:先序序列中对其左右子树遍历顺序交换得到的结果。
过程如下:

  1. 根据根划分出左右的子树(先序序列) : 1 、 [2 、3 、5] 、 [4]
  2. 交换根的左右子树遍历序列 :1 、 [4] 、 [2 、 3 、 5]
  3. 交换以2为根的左右子树遍历序列 :1 、 [4] 、 [2 、 5 、 3]
  4. 整体逆序得到后序序列 : 3 、 5 、 2 、 4 、 1
class Solution(object):
    def __init__(self):
        self.resu = []
    def postorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if root is None:
            return []
        stack = [root]
        while len(stack):
            root = stack.pop()
            self.resu.append(root.val)
            if root.left:
                stack.append(root.left)
            if root.right:
                stack.append(root.right)
        self.resu.reverse()
        return self.resu

运行结果

执行用时 : 24 ms, 在Remove Nth Node From End of List的Python提交中击败了67.42% 的用户
内存消耗 : 11.7 MB, 在Remove Nth Node From End of List的Python提交中击败了32.09% 的用户

提交时间状态执行用时内存消耗语言
几秒前通过24 ms11.7 MBpython

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal/submissions/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦否

文章对你有用?不妨打赏一毛两毛

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值