使用迭代法对二叉树进行后序遍历——Leetcode系列(六)

二叉树的前中后序遍历之迭代法(非统一风格迭代方式) 文章目录前言一、前序遍历(迭代法)1.代码实现二.中序遍历(迭代法)三、后序遍历(迭代法)总结 前言 「递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中」,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。所以我们用栈也可以是实现二叉树的前后中序遍历。 一、前序遍历(迭代法) 前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子。 为什么要先加入 右孩子,再加入左孩子呢?因. 阅读详情

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

For example:
Given binary tree {1,#,2,3},

   1
    \
     2
    /
   3

return [3,2,1].

Note: Recursive solution is trivial, could you do it iteratively?

My Answer

<span style="font-size:14px;">/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        Stack<TreeNode> stack = new Stack<TreeNode>();
        List<Integer> list = new ArrayList<Integer>();
        if(root == null){
            return list;
        }
        stack.push(root);
        while(!stack.empty()){
            TreeNode top = stack.pop();
            if(top.left == null && top.right == null){
                list.add(top.val);
            }else{
                stack.push(new TreeNode(top.val));
                if(top.right != null){
                    stack.push(top.right);
                }
                if(top.left != null){
                    stack.push(top.left);
                }
            }
        }
        return list;
    }
}</span>

题目来源:https://oj.leetcode.com/problems/binary-tree-postorder-traversal/

【简单】力扣算法题解析LeetCode145:二叉树的后序遍历 这篇文章介绍了二叉树后序遍历的迭代实现方法。通过使用显式栈替代递归,结合状态标记(lastVisited指针)来判断右子树是否已处理,实现了高效的后序遍历算法。该算法时间复杂度为O(n),空间复杂度为O(h),其中h为树高。文章包含详细的设计思路、Java代码实现以及边界条件处理,并附有执行效果截图。该方法避免了递归的系统栈开销,通过精确控制节点访问顺序,确保了遍历的正确性和高效性。 阅读详情

相关推荐

软件测试--用例篇(测试用例的好处、测试用例的七种设计方法、测试用例的粒度、测试用例的评价)

作为软件测试工程师,最主要的工作就是:编写测试用例,那么为什么要编写测试用例?它有什么好处?如何编写测试用例?测试用例写简单好还是复杂好?如何评价测试用例的质量? 天呐撸!能说不会吗?! 作为倾向软件测试工程师的老铁们,还是一起来学习吧! 一、编写测试用例的好处 测试用例是测试者的依据 测试用例使得工作可重复,是自动化测试的基础 补充:自动化测试的前提条件是:功能比较稳定,页面...

cherrydreamsover的博客 3734

二叉树的后续遍历(迭代法)

迭代法实现二叉树的后续遍历 1、递归版本 public static void dfs(TreeNode root){ if(root==null){ return; } if(root.left!=null) dfs(root.left); if(root.right!=null) dfs(root.right); System.out.println(root.val); } 从递归版本可以看出我们第一步需要遍历完所有的左节点 这里

qq502130297的博客 2589

反激变压器设计学习笔记

反激变压器匝比感量设计

m0_55419117的博客 5262

二叉树进阶——迭代实现前中后序遍历

二叉树的递归遍历代码简单且容易理解,具体可以看这篇博客,里面的递归解释的较为详细 数据结构——二叉树的链式结构及实现(C语言) 然而现实生活中,一棵树的节点往往较多且深度更深时,如果继续使用递归就会产生较多的栈帧,导致栈溢出,对于Linux的进程地址空间来说,一个进程所分配的栈的空间大小是有限且较小的,因此这时候我们就需要使用迭代的方式来实现一棵树的遍历。 不过对于现代编译器而言,debug版本下的递归较大时会导致栈溢出,但是release版本编译器做了优化往往和迭代的效率差不多。 尽管这样,迭代方式还是要

900

YOLOv11改进策略【损失函数篇】| Shape-IoU:考虑边界框形状和尺度的更精确度量

本文记录的是改进YOLOv11的损失函数,将其替换成Shape-IoU。现有边界框回归方法通常考虑与之间的几何关系,通过边界框的相对位置和形状计算损失,但忽略了边界框本身的形状和尺度等固有属性对边界框回归的影响。为了弥补现有研究的不足,Shape-IoU提出了一种关注边界框本身形状和尺度的边界框回归方法。

Limiiiing的博客 4595

【网络安全】基于Python的威胁情报自动推送系统设计与实现(含源码)

本文介绍了一个基于 Python 开发的威胁情报自动推送系统的设计与实现。该系统通过集成 AbuseIPDB 威胁情报数据源与即时通讯平台,实现了恶意 IP 地址的自动化采集、筛选与实时推送功能。文章详细阐述了系统的技术架构、核心算法、数据流转过程以及关键代码实现。系统采用多线程并发架构,通过 Long Polling 技术实现实时消息接收,支持自动推送和交互式查询两种工作模式。文章还提供了完整的部署指南和使用说明,包括环境配置、运行方式等内容。

等风来 312

C++【迭代法实现前中后序遍历】

C++【迭代法实现前中后序遍历】

m0_59292239的博客 1584

OpenCV计算机视觉实战(12)——图像金字塔与特征缩放

图像金字塔技术通过对原始图像按不同分辨率进行多层次表示,不仅能提升计算效率,还能为图像融合、检测与识别提供多尺度特征。高斯金字塔 (Gaussian Pyramid) 用于构建多级低通图像,拉普拉斯金字塔 (Laplacian Pyramid) 则提取各层之间的细节信息。本节将深入介绍如何使用 OpenCV 构建高斯与拉普拉斯金字塔,并以经典的图像融合案例,展示图像金字塔在特征缩放与融合中的强大应用。

qq_30167691的博客 1404

笔记83:二叉树前中后序遍历(迭代法 + 栈)

以下代码均为个人尝试编写,并非力扣题解,因此时间和空间复杂度可能并不是最优的,只是记录一下自己当时写这个题的时候的思路;

weixin_44063383的博客 626

MFC Windows 程序设计[122]之树形下拉列表框(附源码)

MFC是微软公司提供的一个类库(class libraries),用以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。有很多初学MFC的小伙伴们都觉得MFC比较难学,看书吧,看了就忘了,网上的一些教程又是写的含糊不清,故而学习起来很吃力...... 故此,本专栏亲自研究,实践,由易到难,层层深入,将调试过程中所遭所遇进行详细讲解,注意事项进行一一列举,希望能够帮助到各位初学MFC的小伙伴,避免走弯路,费时费力。.........

hnjzfwy的博客 458

【SpringBoot 3.x 第57节】Spring Boot 3 启动快得不讲武德?揭秘 Spring AOT 编译引擎背后的真相!

🏆本文收录于《滚雪球学SpringBoot 3》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。    本专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot3教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。    若还想学习更多,可直接前往《滚雪球学SpringBoot(全版本合集)》,涵盖SpringBoot所有版本教学文章

**My Coding Family** 1760

leetcode145. 二叉树的后序遍历,递归法+迭代法,全过程图解+步步解析,一点点教会你迭代法后序遍历

leetcode145. 二叉树的后序遍历,递归法+迭代法,全过程图解+步步解析,一点点教会你迭代法后序遍历

热爱C++和golang的学生 1676

对halcon形状匹配算法的一点分析

基于Intel VTune Profiler对halcon形状匹配算法的一点分析

manuoo的专栏 567

二叉树遍历之统一迭代法:轻松实现前中后序遍历

在二叉树的遍历中,我们常常会遇到前序遍历、中序遍历和后序遍历这三种方式。递归是一种很直观的实现方法,但迭代法也有其独特的优势。今天我们要介绍一种二叉树遍历的统一迭代法,它可以像递归法通过调整顺序那样,轻松实现前、中、后三种遍历方式。

Hhjhj255的博客 1322

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

二叉树的前中后序遍历(迭代法)( 含leetcode上三道【前中后序】遍历题目)

此时我们用迭代法写出了二叉树的前后中序遍历,大家可以看出前序和中序是完全两种代码风格,并不像递归写法那样代码稍做调整,就可以实现前后中序。这是因为前序遍历中访问节点(遍历节点)和处理节点(将元素放进res数组中)可以同步处理,但是中序就无法做到同步!上面这句话,可能一些同学不太理解,建议自己亲手用迭代法,先写出来前序,再试试能不能写出中序,就能理解了。

YouMing_Li的博客 1149

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

二叉树的前中后序遍历(迭代法)

本文系统介绍了二叉树前序、中序和后序遍历的迭代实现方法。前序遍历采用栈结构,按;根→右→左 ;顺序入栈;中序遍历先全部左子树入栈再访问节点;后序遍历则通过修改前序遍历顺序为"根→右→左 ;后反转结果。三种遍历时间复杂度均为O(n),空间复杂度最坏O(n)。与递归实现相比,迭代方法避免了栈溢出风险,处理大型树更稳定。每种遍历方式都配有详细代码解析、执行示例和复杂度分析,并讨论了实际应用场景,为掌握树结构操作提供了系统指导。

mrjieke6的博客 1586

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

LeetCode刷题笔记:二叉树前序遍历、中序遍历、后序遍历和层序遍历 | 递归法 | 迭代法 | 统一迭代法 | 深度优先搜索 | 广度优先搜索

Problem:144. 二叉树的前序遍历Problem:94.二叉树的中序遍历Problem:145.二叉树的后序遍历Problem:102. 二叉树的层序遍历Problem:107. 二叉树的层序遍历 II二叉树的遍历方式有多种,毛毛张今天在这里结合代码随想录的教程来分享一下二叉树的多种遍历方式及代码实现深度优先遍历和广度优先遍历。

神马都会亿点点的毛毛张 1205

leetcode144. 二叉树的前序遍历、94 二叉树的中序遍历、145 二叉树的后序遍历

从深度优先遍历和广度优先遍历进一步拓展,才有如下遍历方式:在深度优先遍历中:有三个顺序,前中后序遍历,很容易搞混,这里有一个技巧:这里前中后,其实指的就是的遍历顺序,只要记住 前中后序指的就是的位置就可以了看如下中间节点的顺序,就可以发现,中间节点的顺序就是所谓的遍历方式前序遍历:中左右中序遍历:左中右后序遍历:左右中可以对着下图,看看自己理解的前后中序有没有问题:二叉树的遍历方式已经学会了,现在可以退出啦(bushi。

qq_68664071的博客 816

二叉树的统一迭代法 | LeetCode 144. 二叉树的前序遍历、LeetCode 94. 二叉树的中序遍历、LeetCode 145. 二叉树的后序遍历

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

2301_80211119的博客 765

JavaScript:二叉树(前序遍历,中序遍历,后序遍历,递归法,统一迭代法)

JavaScript:二叉树(前序遍历,中序遍历,后序遍历,递归法,统一迭代法)

weixin_51249285的博客 2421

【算法系列-二叉树】二叉树遍历系列(递归+迭代)

欢迎来到【算法系列】第六弹 🏆 二叉树,接下来我们将围绕二叉树这类型的算法题进行解析与练习!一起加油吧!!( •̀ ω •́ )✧✨

Mwt258的博客 2098

力扣刷题 二叉树的迭代遍历

题干给你二叉树的根节点root,返回它节点值的遍历。

never1624的博客 1795

二叉树后序遍历(递归法和迭代法(非递归法))——C++

一、二叉树后序遍历 后序遍历是先遍历左子节点left,在遍历右子节点right,最后遍历父节点parent,即遍历顺序:1.2 迭代法 由于后续遍历如果按照正常迭代思路去实现将不好理解和实现,仔细观察下面前序和后续遍历顺序,可以发现一个规律: 前序遍历:parent ——> left ——> right 前序遍历: left ——> right ——>parent, 将后续遍历逆序过来遍历,则:parent ——> right ——>left 通过观察1和3可以发现,两者都是先遍历父节点,再遍历左

净无邪博客 2221

力扣二叉树的先、中、后序遍历(递归和迭代法)

5出栈,然后7入栈,最后7出栈。中序遍历的遍历顺序是左、根、右,与先序遍历不同,中序遍历的遍历节点和处理节点并不相同,第一个遍历的节点是根节点,而我们要处理的节点是一整棵二叉树的最左边的那个节点,所以相比先序和后序遍历,中序遍历要多一个指针来指向当前处理的节点。先序遍历的顺序是根、左、右,后序遍历的顺序是左、右、根,我们可以将原本先序遍历的代码修改成让左孩子先入栈,再将右孩子入栈,即最终得出来的数组是根、右、左的顺序,最后将数组进行反转,就可以得到我们的后序遍历啦。3.确定单层循环逻辑。

2301_78245220的博客 731

LeetCode 145 二叉树的后序遍历

LeetCode 145 二叉树的后序遍历 题目链接 给定一个二叉树,返回它的 后序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 看题目的意思是想让我们写个非递归的后序遍历,但那个非常复杂,所以我强行来了一波递归????,AC代码如下: /** * Definition for a binary tree node. * struct TreeNode { * int val; * Tr

旺崽的博客 2728

算法打卡day12|二叉树篇01|Leetcode 144. 二叉树的前序遍历、94. 二叉树的中序遍历、145. 二叉树的后序遍历

JAVA算法|二叉树篇01Leetcode 144. 二叉树的前序遍历、94. 二叉树的中序遍历、145. 二叉树的后序遍历

改变从现在开始 1667
上一篇: 使用插入排序算法对列表进行排序——Leetcode系列(五)
下一篇: 使用迭代法对二叉树进行前序遍历——Leetcode系列(七)
Hooting
博客等级 码龄17年 11粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值