二叉树的后序遍历非递归算法

二叉树的后序遍历非递归算法1 对于树的遍历我们最常用的三种遍历方法分别是前序遍历 中序遍历和后序遍历 使用的方法是深度优先遍历树的每一个节点 这些遍历方法都是使用递归函数来进行实现的 在数据量大的情况下是比较低效的 原因在于系统帮助我们调用了一个栈并且做了诸如保护现场和恢复现场等复杂的操作 才使得遍历可以使用非常简单的代码来实现 所以我们可以模仿系统中调用的栈自己可以来写一下栈 模仿其中的过程就可以完成对于三种遍历算法的

1. 对于树的遍历我们最常用的三种遍历方法分别是前序遍历、中序遍历和后序遍历,使用的方法是深度优先遍历树的每一个节点,这些遍历方法都是使用递归函数来进行实现的,在数据量大的情况下是比较低效的,原因在于系统帮助我们调用了一个栈并且做了诸如保护现场和恢复现场等复杂的操作,才使得遍历可以使用非常简单的代码来实现,所以我们可以模仿系统中调用的栈自己可以来写一下栈,模仿其中的过程就可以完成对于三种遍历算法的实现,使用自定义的栈来代替系统栈可以得到效率上的提升,下面是对于后序遍历的非递归算法的实现

2. 首先模仿这个系统栈我们需要清楚的是系统栈为我们做了什么事情,下面以一棵二叉树为例来模仿其中的节点入栈与出栈的过程

创建的二叉树如下:

二叉树的后序遍历非递归算法

后序遍历为:5 3 2 4 1

先序遍历为:1 2 5 3 4

逆后序遍历为:1 4 2 3 5

从逆后序遍历与先序遍历的关系中我们可以知道逆后序遍历序列为先序遍历交换左右子树的遍历顺序得到的,所以我们得到了逆后序序列之后然后逆序就可以得到后序遍历的序列了,所以需要两个栈,第一个栈用来存储先序遍历交换左右子树的遍历的中介结果,第二个是存储后序遍历的结果(逆序也就是可以理解为先进后出的意思)

下面是模仿元素进栈与出栈的过程:

① 1节点进栈,在循环中弹出1节点压入到第二个栈中,发现左右节点不为空那么将左右节点压入栈1,这个与先序遍历中将左右子树压入到栈顶的顺序是相反的

② 弹出4节点压入到第二个栈中,发现左右孩子都为空那么不进行任何的操作

③ 弹出2节点压入到第二个栈中,发现左右节点不为空那么将左右节点压入到栈1中

④ 弹出3节点压入到第二个栈中,发现左右孩子都为空不进行任何操作

⑤ 弹出5节点压入到第二个栈中,发现左右孩子都为空不进行任何操作

最后栈为空那么退出循环结束

3. 具体的代码如下:

import java.util.Stack; public class Main { public static void main(String[] args) { TreeNode 
  
    root = new TreeNode 
   
     (1); TreeNode 
    
      l = new TreeNode 
     
       (2); TreeNode 
      
        r = new TreeNode 
       
         (4); TreeNode 
        
          ll = new TreeNode 
         
           (5); TreeNode 
          
            lr = new TreeNode 
           
             (3); root.left = l; root.right = r; l.left = ll; l.right = lr; postOrder(root); } @SuppressWarnings({ "rawtypes", "unchecked" }) private static void postOrder(TreeNode 
            
              root) { Stack 
             
               src = new Stack 
              
                (); Stack 
               
                 res = new Stack 
                
                  (); src.push(root); while(!src.isEmpty()){ TreeNode 
                 
                   p = src.pop(); res.push(p); if(p.left != null){ src.push(p.left); } if(p.right != null){ src.push(p.right); } } //输出最终后序遍历的结果 while(!res.isEmpty()){ System.out.print(res.pop().val + " "); } } public static class TreeNode 
                  
                    { T val; TreeNode 
                   
                     left; TreeNode 
                    
                      right; public TreeNode(T val) { super(); this.val = val; } } } 
                     
                    
                   
                  
                 
                
               
              
             
            
           
          
         
        
       
      
     
    
  
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222805.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午2:59
下一篇 2026年3月17日 下午2:59


相关推荐

  • torch.optim.lr_scheduler:调整学习率

    torch.optim.lr_scheduler:调整学习率本文是笔者在学习cycleGAN的代码时,发现其实现了根据需求选择不同调整学习率方法的策略,遂查资料了解pytorch各种调整学习率的方法。主要参考:https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate1综述torch.optim.lr_scheduler模块提供了一些根据epoch训练次数来调整学习率(…

    2025年8月18日
    7
  • Flyway简介

    Flyway简介Flyway 简介总结 Flyway 可以很方便的帮我们完成数据库部署和增量升级 很有用 但是版本回滚操作并不给力 1 简介 1 1 Flyway 是什么 Flyway 是一款数据库迁移 migration 工具 简单点说 就是在你部署应用的时候 帮你执行数据库脚本的工具 Flyway 支持 SQL 和 Java 两种类型的脚本 你可以将脚本打包到应用程序中 在应用程序启动时 由 Fl

    2026年3月26日
    2
  • 华为云:申请免费证书、部署HTTPS证书操作流程[通俗易懂]

    华为云:申请免费证书、部署HTTPS证书操作流程[通俗易懂]一、前提:(1)已经有华为云账号;(2)已经申请域名;(3)已经购买华为云弹性服务器;二、目的:(1)部署SSL证书之后能通过https地址访问服务;三、流程:1.申请免费证书:(注:官方证书操作链接:https://support.huaweicloud.com/usermanual-scm/scm_01_0132.html)(1)在搜索栏搜索“免…

    2026年4月15日
    3
  • 谷歌如何换搜索引擎图片_Google谷歌搜索引擎

    谷歌如何换搜索引擎图片_Google谷歌搜索引擎1.如下图是默认的搜索引擎2.点击三个点3.点击设置->再点击搜索引擎4.选择自己喜欢的搜索引擎

    2025年9月6日
    7
  • e5续订程序_office e5开发者

    e5续订程序_office e5开发者E5调用API续订服务:Microsoft365E5RenewX:功能性:网页访问部分继承于Microsoft365E5RenewWeb并做了部分改进,数据库改进现在支持单用户多运行账号;内核API调用继承于Microsoft365E5RenewPlus;可部署性:支持开放站点部署和私享部署,私享部署不再强制要求配置Https和OAuth平台兼容性:使用Asp.NetCore作为跨平台框架增适用于WindowsLinuxMacOS…

    2022年9月30日
    3
  • ideal 2021 激活码【在线注册码/序列号/破解码】

    ideal 2021 激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    55

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号