背景

今天,第二期基础算法(Leetcode)刻意练习训练营 的打卡任务是二叉树的中序遍历,由于二叉树的遍历方式通常来说有四种:前序遍历、中序遍历、后序遍历以及层次遍历,而LeetCode也有二叉树的后序遍历题目,故一起写了。


题目

  • 题号:145
  • 难度:困难
  • https://leetcode-cn.com/problems/binary-tree-postorder-traversal/

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

示例:

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

进阶: 递归算法很简单,你可以通过迭代算法完成吗?


实现

第一种:利用栈

前序遍历顺序为:根 -> 左 -> 右

后序遍历顺序为:左 -> 右 -> 根

如果1:我们将前序遍历中节点插入结果链表尾部的逻辑,修改为将节点插入结果链表的头部

那么结果链表就变为了:右 -> 左 -> 根

如果2:我们将遍历的顺序由从左到右修改为从右到左,配合如果1

那么结果链表就变为了:左 -> 右 -> 根

这刚好是后序遍历的顺序

基于这两个思路,我们处理方式如下:

第一:修改前序遍历代码中,节点写入结果链表的代码,将插入队尾修改为插入队首

第二:修改前序遍历代码中,每次先查看左节点再查看右节点的逻辑,变为先查看右节点再查看左节点

  • 执行结果:通过
  • 执行用时:272 ms, 在所有 C# 提交中击败了 98.15% 的用户
  • 内存消耗:30 MB, 在所有 C# 提交中击败了 6.90% 的用户
/*** Definition for a binary tree node.* public class TreeNode {*     public int val;*     public TreeNode left;*     public TreeNode right;*     public TreeNode(int x) { val = x; }* }*/
public class Solution
{public IList<int> PostorderTraversal(TreeNode root){IList<int> lst = new List<int>();Stack<TreeNode> stack = new Stack<TreeNode>();while (stack.Count != 0 || root != null){if (root != null){stack.Push(root);lst.Insert(0, root.val);root = root.right;}else{TreeNode node = stack.Pop();root = node.left;}}return lst;}
}

第二种:利用递归

  • 执行结果:通过
  • 执行用时:276 ms, 在所有 C# 提交中击败了 89.81% 的用户
  • 内存消耗:30 MB, 在所有 C# 提交中击败了 6.90% 的用户
/*** Definition for a binary tree node.* public class TreeNode {*     public int val;*     public TreeNode left;*     public TreeNode right;*     public TreeNode(int x) { val = x; }* }*/
public class Solution
{public IList<int> PostorderTraversal(TreeNode root){IList<int> lst = new List<int>();PostOrder(root, lst);return lst;}private void PostOrder(TreeNode node, IList<int> lst){if (node == null)return;PostOrder(node.left, lst);PostOrder(node.right, lst);lst.Add(node.val);}
}

Python 语言

  • 执行结果:通过
  • 执行用时:28 ms, 在所有 Python3 提交中击败了 93.45% 的用户
  • 内存消耗:13.6 MB, 在所有 Python3 提交中击败了 5.09% 的用户
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = Noneclass Solution:def postorderTraversal(self, root: TreeNode) -> List[int]:lst = list()self.postOrder(root, lst)return lstdef postOrder(self, node: TreeNode, lst: list):if node is None:returnself.postOrder(node.left, lst)self.postOrder(node.right, lst)lst.append(node.val)

往期活动

LSGO软件技术团队会定期开展提升编程技能的刻意练习活动,希望大家能够参与进来一起刻意练习,一起学习进步!

  • Python基础刻意练习活动即将开启,你参加吗?
  • Task01:变量、运算符与数据类型
  • Task02:条件与循环
  • Task03:列表与元组
  • Task04:字符串与序列
  • Task05:函数与Lambda表达式
  • Task06:字典与集合
  • Task07:文件与文件系统
  • Task08:异常处理
  • Task09:else 与 with 语句
  • Task10:类与对象
  • Task11:魔法方法
  • Task12:模块

我是 终身学习者“老马”,一个长期践行“结伴式学习”理念的 中年大叔

我崇尚分享,渴望成长,于2010年创立了“LSGO软件技术团队”,并加入了国内著名的开源组织“Datawhale”,也是“Dre@mtech”、“智能机器人研究中心”和“大数据与哲学社会科学实验室”的一员。

愿我们一起学习,一起进步,相互陪伴,共同成长。

后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码:

刻意练习:LeetCode实战 -- 二叉树的后序遍历相关推荐

  1. LeetCode 145. 二叉树的后序遍历(后序遍历总结)

    文章目录 1. 题目信息 2. 解法 2.1 递归 2.2 循环,必须掌握 a. 单栈 b. 双栈解法 3. 前中后序总结 1. 题目信息 给定一个二叉树,返回它的 后序 遍历. 示例:输入: [1, ...

  2. Leetcode 145. 二叉树的后序遍历 (每日一题 20210930)

    给定一个二叉树,返回它的 后序 遍历.示例:输入: [1,null,2,3] 1\2/3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗?链接:https://leetcod ...

  3. [leetcode]145.二叉树的后序遍历

    给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1\2/3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 1.递归解法 class So ...

  4. LeetCode —— 145. 二叉树的后序遍历【递归与迭代】(Python)

    给定一个二叉树,返回它的 后序 遍历. 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解法一:递归 # Definition for a binary tree node. # class Tr ...

  5. LeetCode 145 二叉树的后序遍历(非递归)

    题目: 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1\2/3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解题思路: 1.使用一 ...

  6. LeetCode 145. 二叉树的后序遍历(递归)(迭代)(颜色标记法)

    题目描述 给定一个二叉树,返回它的后序遍历 思路 详见链接 代码 递归 #class TreeNode: # def __init__(self,x): # self.val = x # self.l ...

  7. LeetCode 145 ——二叉树的后序遍历

    1. 题目 2. 解答 2.1. 递归法 定义一个存放树中数据的向量 data,从根节点开始,如果节点不为空,那么 递归得到其左子树的数据向量 temp,将 temp 合并到 data 中去 递归得到 ...

  8. [LeetCode] Binary Tree Postorder Traversal 二叉树的后序遍历

    Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary ...

  9. Leetcode: 二叉树的后序遍历

    Leetcode: 二叉树的后序遍历 后遍历的流程:一直往下走,把路口记下来,假如路口有馒头,我们是不吃的,因为要先吃最后的,中间的岔路如果有岔路,就把右边的岔路记下来,但是因为右边没有走过,所以访问 ...

最新文章

  1. Received status code 403 from server: ForbiddenDisable Gradle ‘offline mode‘ and sync project
  2. linux图片切割,从相册截图 - Android大图片裁剪终极解决方案_Linux编程_Linux公社-Linux系统门户网站...
  3. 2016-09-09
  4. C/C++笔试、面试题
  5. 给hbase增加协处理器报ERROR: org.apache.hadoop.hbase.DoNotRetryIOException:错误
  6. Caused by: java.lang.IllegalArgumentException: No enum constant org.apache.ibatis.type.JdbcType.INT
  7. 用.NET进行客户端Web开发?看这个Bootstrap风格的BlazorUI组件库
  8. deepin nginx连接php,利用docker运行nginx加上本机的php-fpm。访问html文件正常,但是访问php文件就报错404...
  9. Redhat或者Centos手动安装Vim,
  10. Leetcode题目:Reverse String
  11. ---转载---phython资料
  12. Javascript: 前端JS生成验证码
  13. DP1363F国产替代CLRC663_支持NFC双向通信连接APP多协议远距离读写芯片
  14. 双网卡上网冲突解决_交换机如何设置,控制IP地址冲突故障
  15. LCP 3. 机器人大冒险
  16. edgex-ui中文版下载
  17. codewars day1
  18. 骨干是折腾出来的 读书笔记10
  19. 你的饿了么订单又超时啦!
  20. NCRE | 三级网络技术笔记

热门文章

  1. java和内存交互,java内存模型-内存间交互操作
  2. java登陆界面连接数据库_java 登陆界面怎么写,连接数据库后
  3. java 简单万年历_JAVA实现的简单万年历代码
  4. 零基础学Java程序有什么好的建议
  5. 小猿圈Linux基础面试题,看看你能答对几道?
  6. Python运维项目中用到的redis经验及数据类型
  7. php中magic_quotes_gpc对unserialize的影响
  8. 浩方平台CS流量评估
  9. Mysql左连接分页查询
  10. 【跟着我们学Golang】之面向对象