当前位置: 首页 > news >正文

2025年--Lc218-145. 二叉树的后序遍历(非递归版,栈,带测试用例)-Java版

1.题目

在这里插入图片描述
在这里插入图片描述

2.思路

用栈实现,正常的后序遍历是左右根
添加一个辅助栈,节点入栈的顺序是根右左,这样节点弹出的时候才是左右根。

(1)根节点首先被压入stack中,然后被弹出并压入output中。
(2)遍历过程:
stack用于存储需要遍历的节点。
output用于反转遍历顺序。
入栈顺序:
st的根入栈了先弹出。然后st的根节点的左子节点先入栈,右子节点后入栈。这样st出栈顺序是右-左。
out 里存的是“根-右 左”这种倒着的遍历顺序
我从 out 反向弹出时,就变成了“左 右 根”
(3)将output中的节点依次弹出并存入结果列表result中,这样得到的顺序就是后序遍历(左-右-根)。

3.代码实现

输入root=[1,2,3]
输出[2,3,1]

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;class TreeNode{int val;TreeNode left;TreeNode right;TreeNode(){};TreeNode(int val){this.val=val;};TreeNode(int val,TreeNode left,TreeNode right){this.val=val;this.left=left;this.right=right;}
}
public class postOrder2 {//这边的root代表一个数组,存放各个节点public List<Integer> pTS(TreeNode root){//1.先定义一个用于遍历结果的空列表List<Integer> res=new ArrayList<>();//2.初始化一个空栈,存储需要遍历的节点,也就是存入栈元素Stack<TreeNode> st=new Stack<>();//将根节点的内容压入栈中,比如root = [1,2,3]st.push(root);//辅助栈弹结果,用户反转遍历顺序。反转是根右左,正确的是左右根。Stack<TreeNode> out=new Stack<>();while(!st.isEmpty())//当栈不空的时候{//将栈中当前值弹出。//st先存的根先弹出也是根,st再存左右,st弹出的时候是右左TreeNode cur= st.pop();//将当前节点推入辅助栈,out存的顺序是根右左out.push(cur);//入栈先左后右(根左右)if(cur.left!=null){st.push(cur.left);}if(cur.right!=null){st.push(cur.right);}}//当辅助栈的元素不为空,出栈先右后左while(!out.isEmpty()){//弹出的顺序正好是左右根//再反转弹出 左右根res.add(out.pop().val);}return res;}public  static void main(String[] args){TreeNode root=new TreeNode(1);root.left=new TreeNode(2);root.right=new TreeNode(3);postOrder2 test=new postOrder2();List<Integer> res=test.pTS(root);System.out.println(res);}}
http://www.dtcms.com/a/540954.html

相关文章:

  • docker ubuntu22.04更新报错问题——筑梦之路
  • 网站维护排名报价单模板怎么做
  • AI的“套娃”:深度解析人工智能、机器学习与深度学习
  • 配置(2):ubuntu下载后:软件源和远程连接的配置
  • 第14篇 c# HttpWebRequest添加授权token使用方法
  • Netflix Prize竞赛:推荐系统的里程碑与机器学习革命的催化剂
  • TCP4位首部长度
  • 做便宜网站中国电子商务网站
  • RL + LLM 强化学习 + 大模型微调 (PPO + GRPO)
  • 关于Redis的主从复制功能
  • 笔记:理解Yolo网络运行规律并添加自制简易功能(以Yolo11为例)
  • node.js学习(一)
  • 江苏品牌网站建设网站如何防采集
  • mybatis-plus官方文档解析
  • PySide6 Win10记事本从零到一——第三章 记事本主窗口基础
  • 中国《个人信息保护法》与欧盟《GDPR》的差异对比
  • 手动配置ingress讲服务端获取客户端的真实用户IP
  • 做网站导航按钮怎么做网页游戏大全力荐新壹玩
  • 迅为rk3568开发板配置 rk3568_uart_config.hcs
  • 临沂哪里做网站比较好wordpress注册中文插件
  • 二谈-双FIFO流水案例
  • 揭开Linux跨平台 adb调试原理神秘面纱
  • 零基础学jsp网站开发自己做的网站链接
  • 根据参数动态配置多数据源
  • 帝国cms小程序获取分类的api接口
  • 黄冈网站建设有哪些某互联网公司开发官网的首页
  • 前端与Node.js
  • 怎样做电商网站好视频教学ps做网站页面设置为多大
  • 肇庆市住房和城乡建设局网站企业网站维护工作内容
  • 芯片选型避坑指南:如何根据需求快速筛选MCU