刻意练习:LeetCode实战 -- 二叉树的后序遍历
背景
今天,第二期基础算法(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实战 -- 二叉树的后序遍历相关推荐
- LeetCode 145. 二叉树的后序遍历(后序遍历总结)
文章目录 1. 题目信息 2. 解法 2.1 递归 2.2 循环,必须掌握 a. 单栈 b. 双栈解法 3. 前中后序总结 1. 题目信息 给定一个二叉树,返回它的 后序 遍历. 示例:输入: [1, ...
- Leetcode 145. 二叉树的后序遍历 (每日一题 20210930)
给定一个二叉树,返回它的 后序 遍历.示例:输入: [1,null,2,3] 1\2/3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗?链接:https://leetcod ...
- [leetcode]145.二叉树的后序遍历
给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1\2/3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 1.递归解法 class So ...
- LeetCode —— 145. 二叉树的后序遍历【递归与迭代】(Python)
给定一个二叉树,返回它的 后序 遍历. 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解法一:递归 # Definition for a binary tree node. # class Tr ...
- LeetCode 145 二叉树的后序遍历(非递归)
题目: 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [1,null,2,3] 1\2/3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解题思路: 1.使用一 ...
- LeetCode 145. 二叉树的后序遍历(递归)(迭代)(颜色标记法)
题目描述 给定一个二叉树,返回它的后序遍历 思路 详见链接 代码 递归 #class TreeNode: # def __init__(self,x): # self.val = x # self.l ...
- LeetCode 145 ——二叉树的后序遍历
1. 题目 2. 解答 2.1. 递归法 定义一个存放树中数据的向量 data,从根节点开始,如果节点不为空,那么 递归得到其左子树的数据向量 temp,将 temp 合并到 data 中去 递归得到 ...
- [LeetCode] Binary Tree Postorder Traversal 二叉树的后序遍历
Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary ...
- Leetcode: 二叉树的后序遍历
Leetcode: 二叉树的后序遍历 后遍历的流程:一直往下走,把路口记下来,假如路口有馒头,我们是不吃的,因为要先吃最后的,中间的岔路如果有岔路,就把右边的岔路记下来,但是因为右边没有走过,所以访问 ...
最新文章
- Received status code 403 from server: ForbiddenDisable Gradle ‘offline mode‘ and sync project
- linux图片切割,从相册截图 - Android大图片裁剪终极解决方案_Linux编程_Linux公社-Linux系统门户网站...
- 2016-09-09
- C/C++笔试、面试题
- 给hbase增加协处理器报ERROR: org.apache.hadoop.hbase.DoNotRetryIOException:错误
- Caused by: java.lang.IllegalArgumentException: No enum constant org.apache.ibatis.type.JdbcType.INT
- 用.NET进行客户端Web开发?看这个Bootstrap风格的BlazorUI组件库
- deepin nginx连接php,利用docker运行nginx加上本机的php-fpm。访问html文件正常,但是访问php文件就报错404...
- Redhat或者Centos手动安装Vim,
- Leetcode题目:Reverse String
- ---转载---phython资料
- Javascript: 前端JS生成验证码
- DP1363F国产替代CLRC663_支持NFC双向通信连接APP多协议远距离读写芯片
- 双网卡上网冲突解决_交换机如何设置,控制IP地址冲突故障
- LCP 3. 机器人大冒险
- edgex-ui中文版下载
- codewars day1
- 骨干是折腾出来的 读书笔记10
- 你的饿了么订单又超时啦!
- NCRE | 三级网络技术笔记