java二叉树前中后序遍历

  • 代码随想录解题思路
  • 🆒力扣前序题目
  • 🆒力扣中序题目
  • 🆒力扣后序题目

递归遍历

// 前序遍历
class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();preorder(root,res);return res;}public void preorder(TreeNode root, List<Integer> res){if(root==null) return ;res.add(root.val);preorder(root.left,res);preorder(root.right,res);}
}// 中序遍历
class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> res=new ArrayList<>();inorder(root,res);return res;}public void inorder(TreeNode root,List<Integer> res){if(root==null) return ;inorder(root.left,res);res.add(root.val);inorder(root.right,res);}
}// 后序遍历
class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();postorder(root, res);return res;}public void postorder(TreeNode root, List<Integer> res) {if (root == null)return;postorder(root.left,res);postorder(root.right,res);res.add(root.val);}
}

🆘二叉树的统一迭代遍历

💡一个大模板,前中后序只需要改变几句代码的顺序即可

代码随想录思路

package com.tree;import jdk.nashorn.internal.ir.SplitReturn;import java.util.*;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;}
}class demo12_BinaryTreeTraversal {/*** 二叉树的非递归前序遍历** @param root* @return 前序遍历的节点列表*/public static List<Integer> preorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();Stack<TreeNode> st = new Stack<>();if (root == null) {return res;} else st.push(root);while (!st.isEmpty()) {TreeNode node = st.peek();if (node != null) {st.pop();if (node.right != null) st.push(node.right);if (node.left != null) st.push(node.left);st.push(node);st.push(null);} else {st.pop();node = st.pop();res.add(node.val);}}return res;}/*** 二叉树的非递归中序遍历** @param root* @return 中序遍历的节点列表*/public static List<Integer> inorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();Stack<TreeNode> st = new Stack<>();if (root == null) {return res;} else st.push(root);while (!st.empty()) {TreeNode cur = st.peek();if (cur != null) {st.pop();//中序遍历:左根右,so入栈顺序是右根左,在根入栈之后记得入栈一个null节点标记if (cur.right != null) st.push(cur.right);st.push(cur);st.push(null);if (cur.left != null) st.push(cur.left);} else {st.pop();cur = st.pop();res.add(cur.val);}}return res;}/*** 二叉树的非递归后序遍历** @param root* @return 后序遍历的节点列表*/public static List<Integer> postorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();if (root == null) {return res;}Stack<TreeNode> st = new Stack<>();st.push(root);while (!st.empty()) {TreeNode point = st.peek();if (point != null) {//出栈左右根,入栈根右左st.pop();st.push(point);st.push(null);if (point.right != null) st.push(point.right);if (point.left != null) st.push(point.left);} else {st.pop();point = st.pop();res.add(point.val);}}return res;}public static void main(String[] args) {// 创建二叉树 [1,null,2,3]TreeNode root = new TreeNode(1);root.right = new TreeNode(2);root.right.left = new TreeNode(3);System.out.println(preorderTraversal(root));System.out.println(postorderTraversal(root));System.out.println(inorderTraversal(root));}
}

迭代遍历

import jdk.nashorn.internal.ir.SplitReturn;import java.util.*;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;}
}class demo12_BinaryTreeTraversal {/*** 二叉树的非递归中序遍历** @param root* @return 中序遍历的节点列表*/public static List<Integer> inorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();Stack<TreeNode> st = new Stack<>();TreeNode cur = root; // 设定一个指针while (cur != null || !st.isEmpty()) {if (cur != null) {st.push(cur);cur = cur.left;} else {cur = st.pop(); // 出栈res.add(cur.val);cur = cur.right;}}return res;}/*** 二叉树的非递归前序遍历** @param root* @return 前序遍历的节点列表*/public static List<Integer> preorderTraversal(TreeNode root) {// 定义resList<Integer> res = new ArrayList<>();if (root == null) {return res;}// 定义栈Stack<TreeNode> st = new Stack<>();st.push(root);while (!st.isEmpty()) {TreeNode tmp = st.pop(); // 出栈res.add(tmp.val);if (tmp.right != null) {st.push(tmp.right); // 先在栈中加入右节点,再加入左节点}if (tmp.left != null) {st.push(tmp.left); // 因为左节点要先出栈,栈是FILO的结构}}return res;}/*** 二叉树的非递归后序遍历** @param root* @return 后序遍历的节点列表*/public static List<Integer> postorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<>();if (root == null) {return res;}Stack<TreeNode> st = new Stack<>();st.push(root);while (!st.isEmpty()) {TreeNode node = st.pop();res.add(node.val);// 注意:入栈顺序相对于前序遍历有改变// 前序遍历的入栈顺序是:中右左// 后序遍历的顺序变成了:中左右,然后反转result_listif (node.left != null) {st.push(node.left);}if (node.right != null) {st.add(node.right);}}Collections.reverse(res);return res;}public static void main(String[] args) {// 创建二叉树 [1,null,2,3]TreeNode root = new TreeNode(1);root.right = new TreeNode(2);root.right.left = new TreeNode(3);System.out.println(preorderTraversal(root));System.out.println(postorderTraversal(root));System.out.println(inorderTraversal(root));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/808311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zabbix“专家坐诊”第236期问答

问题一 Q&#xff1a;我的trap里已经可以收到信息了&#xff0c;后续要怎么创建监控项呀&#xff1f; A&#xff1a;参考&#xff1a; 问题二 Q&#xff1a;snmp和snmp trap咋搞&#xff1f; A&#xff1a;你指的是如何开启这些协议还是如何做监控项&#xff1f; Q&#xff1…

Opentelemetry——Observability Primer

Observability Primer 可观测性入门 Core observability concepts. 可观测性核心概念。 What is Observability? 什么是可观测性&#xff1f; Observability lets us understand a system from the outside, by letting us ask questions about that system without know…

动态开辟字符串malloc

1. 定义一个指针 int *p; 直接给指针赋值会产生段错误 &#xff1a;*p c malloc 函数原型 void *malloc(size_t size) &#xff08;开辟的内容大小&#xff09; C库函数 void *malloc(size_t size)分配所需的内存空间&#xff0c;并返回一个指向它的指针。 作用&…

Java——数组练习

目录 一.数组转字符串 二.数组拷贝 三.求数组中元素的平均值 四.查找数组中指定元素(顺序查找) 五.查找数组中指定元素(二分查找) 六.数组排序(冒泡排序) 七.数组逆序 一.数组转字符串 代码示例&#xff1a; import java.util.Arrays int[] arr {1,2,3,4,5,6}; String…

数据分析——数据规范化

数据规范化是数据分析中的一个重要步骤&#xff0c;其目的在于确保数据的一致性和可比性&#xff0c;提高数据质量和分析结果的准确性。以下是一些数据规范化的常见方法和技术&#xff1a; 数据清洗&#xff1a;此步骤主要清除数据中的重复项、空格、格式错误等&#xff0c;确…

【二分与前缀和】python例题详解

文章目录 1、数的范围 2、数的三次方根 3、前缀和 4、子矩阵的和 5、机器人跳跃问题 1、数的范围 题目 给定一个按照升序排列的长度为 n 的整数数组&#xff0c;以及 q 个查询。对于每个查询&#xff0c;返回一个元素 k的起始位置和终止位置&#xff08;位置从 00 开始计…

批归一化(BN)在神经网络中的作用与原理

文章目录 1. 批归一化&#xff08;BN&#xff09;在神经网络中的作用与原理1.1 作用与优势1.2 原理与推导 2. 将BN应用于神经网络的方法2.1 训练时的BN 2. 将BN应用于神经网络的方法2.1 训练时的BN2.2 测试时的BN代码示例&#xff08;Python&#xff09;&#xff1a; 3. BN的优…

工厂方法模式(Factory Method Pattern)在JAVA中的应用

JAVA设计模式是一套被广泛认可的解决特定问题的最佳实践。在面向对象的软件设计中&#xff0c;设计模式可以帮助开发者构建可维护、可扩展和灵活的软件系统。本文将介绍工厂方法模式&#xff0c;这是一种创建型设计模式&#xff0c;它提供了一种创建对象的最佳方式。 ## 1. 工…

Day8:学习尚上优选项目

学习计划&#xff1a;完成尚硅谷的尚上优选项目 学习进度&#xff1a;尚上优选项目 知识点&#xff1a; 五、尚上优选微信小程序端 商品详情页 需求分析 页面效果功能分析对应接口 CompletableFuture异步编排 ⅰ. 问题引入并发、串行和并行CompletableFuture概述创建异步对象…

编程规范(保姆级教程)

文章目录 为什么需要编程规范&#xff1f;&#x1f4a1;代码检测工具 ESLint&#x1f4a1;代码格式化 Prettier&#x1f4a1;ESLint 与 Prettier 配合解决代码格式问题eslint支持ts约定式提交规范Commitizen助你规范化提交代码什么是 Git Hooks使用 husky commitlint 检查提交…

探索设计模式的魅力:MVVM模式在AI大模型领域的创新应用-打破传统,迎接智能未来

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 MVVM模式在AI大模型领域的创新应用-打破传统迎接智能未来 &#x1f680; “在人工智能的领域里&a…

算法训练营第37天|LeetCode 738.单调递增的数字 968.监控二叉树

LeetCode 738.单调递增的数字 题目链接&#xff1a; LeetCode 738.单调递增的数字 解题思路&#xff1a; 从后向前遍历&#xff0c;当不满足递增条件时&#xff0c;当前位置赋值为9&#xff0c;前一位减一。之后记录不满足位置&#xff0c;将后续全部赋值为9. 代码&#x…

【springboot】项目启动时打印全部接口方法

方法&#xff1a;在你springboot项目的基础上&#xff0c;创建下面的类&#xff1a; package com.llq.wahaha.listener;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework…

【Entity Framework】如何使用EF中的生成值

【Entity Framework】如何使用EF中的生成值 文章目录 【Entity Framework】如何使用EF中的生成值一、概述二、默认值三、计算列四、设置主键五、显示配置值生成六、设置日期/时间值生成6.1 创建时间戳6.2 更新时间戳 七、替代值生成八、无值生成九、总结 一、概述 数据库列的值…

DHCP抓包分析

DHCP动态路由配置协议&#xff0c;是C/S架构&#xff0c;由DHCP服务器为客户端动态分配IP信息。 DHCP客户端首次接入网络数据交互过程&#xff1a; 如何解决IP地址的冲突&#xff1a; ▫ DHCP服务器端&#xff1a;收到DHCP DISCOVER报文时&#xff0c;给客户端分配IP地址前会发…

【C++第三阶段】stackqueue容器

以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 stack容器queue容器 stack容器 是什么&#xff1f;功能是什么&#xff1f;常用接口是什么&#xff1f;局限性有哪些&#xff1f;优势又有哪些&#xff1f; 栈容器&#xff0c;先进…

error-ckeditor-duplicated-modules 在vue中引入ckeditor插件报错

报错原因&#xff1a; 由于集成了webpack&#xff0c;统一引入了ckeditor &#xff0c;但是页面里面我们又通过import引入了一遍&#xff0c;所以导致引入重复了 解决&#xff1a; ckeditor本身除了基本的一些功能&#xff0c;其他基本全靠插件引入&#xff0c;所以想加功能必…

速看!这8道嵌入式面试题你都会吗?

大家好&#xff0c;我是知微&#xff01; 正逢求职季&#xff0c;分享一些嵌入式面试当中经常会遇到的题目&#xff0c;希望这些干货对小伙伴们面试有用哦&#xff01; 1、介绍一下static关键字的作用 在C语言中&#xff0c;static 关键字有几种不同的作用&#xff0c;根据其…

谷歌推出Vids:AI驱动的PowerPoint,重新定义演示文稿的未来|TodayAI

不管你喜不喜欢&#xff0c;找到集成了AI技术以简化常见任务的工具和服务变得越来越容易。谷歌的应用套件迅速成为了一个集成了Gemini AI的产品中心&#xff0c;这些产品可以在工作场所到你的家中的任何地方使用。例如&#xff0c;如果在工作中做演示一直是你的痛点&#xff0c…

linux环境下安装 OpenDevin 遇到的问题以及解决方法

OpenDevin: Code Less, Make More https://github.com/OpenDevin/OpenDevin OpenDevin&#xff0c;一个引人注目的开源项目&#xff0c;旨在重现并超越Devin的卓越能力。Devin&#xff0c;作为一位拥有卓越技术实力的自主AI软件工程师&#xff0c;不仅能够执行高度复杂的工程任…