数据结构-二叉树的遍历

二叉树的遍历广义上是指下面我们说的七种遍历

广度优先搜索 : 递归完成 前序 中序 后序 的遍历
深度优先搜索 : 层序遍历(借助队列)
非递归的迭代法完成前中后遍历(借助栈)

代码合集如下

package TreeDemo;
import java.util.*;
public class BinaryTreeTest {public static class TreeNode {int val;TreeNode left;TreeNode right;public TreeNode(int val) {this.val = val;}}/*** 下面的几种方法分别是* 前中后序的递归遍历(又称深度优先搜索)* 前中后序的迭代法遍历(用栈去模拟)* 层序遍历(广度优先搜索 --> 用队列模拟)*///前序遍历的递归法List<Integer> list1 = new ArrayList<>();public List<Integer> preOrder(TreeNode root) {if (root == null) {return list1;}//进入递归环节list1.add(root.val);preOrder(root.left);preOrder(root.right);return list1;}//前序遍历的非递归写法(迭代法)private Stack<TreeNode> stack1 = new Stack<>();private List<Integer> list2 = new ArrayList<>();public List<Integer> preOrderUseWhile(TreeNode root) {if (root == null) {return list2;}stack1.push(root);while (!stack1.isEmpty()) {TreeNode node = stack1.pop();list2.add(node.val);if (node.right != null) {stack1.push(root.right);}if (node.left != null) {stack1.push(root.left);}}return list2;}//中序遍历的递归法private List<Integer> list3 = new ArrayList<>();public List<Integer> inOrder(TreeNode root) {if (root == null) {return list3;}inOrder(root.left);list3.add(root.val);inOrder(root.right);return list3;}//中序遍历的迭代法private List<Integer> list4 = new ArrayList<>();private Stack<TreeNode> stack2 = new Stack<>();public List<Integer> inOrderUseWhile(TreeNode root) {if (root == null) {return list4;}TreeNode cur = root;//这里的逻辑判断要重视一下啊,这个条件的逆命题是栈为空同时指针也为空...while (!stack2.isEmpty() || cur != null) {if (cur != null) {stack2.push(cur);cur = cur.left;} else {TreeNode node = stack2.pop();list4.add(node.val);cur = node.right;}}return list4;}//后序遍历的递归法private List<Integer> posOrderList = new ArrayList<>();public List<Integer> posOrder(TreeNode root) {if (root == null) {return posOrderList;}posOrder(root.left);posOrder(root.right);posOrderList.add(root.val);return posOrderList;}//后续遍历的迭代法private List<Integer> posOrderlist = new ArrayList<>();private Stack<TreeNode> posOrderStack = new Stack<>();public List<Integer> posOrderUseWhile(TreeNode root) {if (root == null) {return posOrderlist;}posOrderStack.push(root);while (!posOrderStack.isEmpty()) {TreeNode node = posOrderStack.pop();posOrderlist.add(node.val);if (node.left != null) {posOrderStack.push(node.left);}if (node.right != null) {posOrderStack.push(node.right);}}//反转顺序表int size = posOrderlist.size();int left = 0;int right = size - 1;while (left <= right) {Integer temp = posOrderlist.get(left);posOrderlist.set(left, posOrderlist.get(right));posOrderlist.set(right, temp);left++;right--;}return posOrderlist;}/*** 二叉树的层序遍历,运用的是队列的思想* 核心逻辑就是利用队列的大小来定向的控制移动元素的数量从而达到层序遍历的效果* 也就是我们图论中的广度优先搜索...*/public List<List<Integer>> levelList = new ArrayList<>();public Queue<TreeNode> queue = new LinkedList<>();public List<List<Integer>> levelOrder(TreeNode root) {if(root == null){return levelList;}queue.offer(root);while(!queue.isEmpty()){int size = queue.size();List<Integer> tempList = new ArrayList<>();while(size-- != 0){TreeNode node = queue.poll();tempList.add(node.val);if(node.left != null){queue.offer(node.left);}if(node.right != null){queue.offer(node.right);}}levelList.add(tempList);}return levelList;}
}

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

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

相关文章

怎么给字符串字段加索引?

怎么给字符串字段加索引&#xff1f; 现在&#xff0c;几乎所有的系统都支持邮箱登录&#xff0c;如何在邮箱这样的字段上建立合理的索引&#xff0c;是我们今天要讨论的问题。 假设&#xff0c;你现在维护一个支持邮箱登录的系统&#xff0c;用户表是这么定义的&#xff1a; …

美富特 | 邀您参加2024全国水科技大会暨技术装备成果展览会

王涛 四川美源环能科技有限公司 技术总监 报告题目&#xff1a;绿色智慧水岛如何助力工业园区污水及再生水资源化利用降碳增效 拥有十余年的环保行业从业经验&#xff0c;对各类前沿物化、生化及膜技术均有丰富的研发、设计及应用经验&#xff0c;先后参与多项重点核心技术…

日本宇宙航空研究“Int-Ball2”自由飞行相机机器人采用的Epson IMU

IMU有助于飞行的稳定控制和电池充电的自动对接- 精工爱普生公司&#xff08;TSE:6724&#xff0c;“Epson”&#xff09;很高兴地宣布&#xff0c;日本宇宙航空研究开发机构&#xff08;JAXA&#xff09;选择了爱普生M-G370系列的惯性测量单元&#xff08;IMU&#xff09;&…

开源相机管理库Aravis例程学习(五)——camera-api

开源相机管理库Aravis例程学习&#xff08;五&#xff09;——camera-api 简介例程代码函数说明arv_camera_get_regionarv_camera_get_pixel_format_as_stringarv_camera_get_pixel_formatARV_PIXEL_FORMAT_BIT_PER_PIXEL 简介 本文针对官方例程中的&#xff1a;03-camera-api…

揭密 scaling laws

Scaling laws OpenAI 在其早期的关于 scaling laws 的论文 [1] 中提出了基础理论&#xff0c;但该文缺乏一些具体的求解过程&#xff0c;且未能在更大规模的模型上进行验证。与此同时&#xff0c;后续研究&#xff0c;例如 DeepMind 的 ChinChilla [2] 还提出了不同的结论。 论…

Swift - 可选项(Optional)

文章目录 Swift - 可选项&#xff08;Optional&#xff09;1. 可选项&#xff08;Optional&#xff09;2. 强制解包&#xff08;Forced Unwrapping&#xff09;3. 判断可选项是否包含值4. 可选项绑定&#xff08;Optional Binding&#xff09;5. 等价写法6. while循环中使用可选…

「PHP系列」PHP 过滤器

文章目录 一、PHP过滤器二、PHP函数和过滤器1. 过滤器示例FILTER_VALIDATE_BOOLEANFILTER_VALIDATE_EMAILFILTER_VALIDATE_FLOATFILTER_VALIDATE_INTFILTER_VALIDATE_IPFILTER_VALIDATE_REGEXPFILTER_SANITIZE_STRINGFILTER_SANITIZE_ENCODEDFILTER_SANITIZE_FULL_SPECIAL_CHAR…

django运行配置

Setting.py # Internationalization # https://docs.djangoproject.com/en/5.0/topics/i18n/# 较早版本的 Django 可以尝试改为zh-CN,具体可查看 # “python/site-packages/django/conf/locale/”中的语言名称 LANGUAGE_CODE zh-Hans# Windows环境中此项的时区必须和系统一致…

在 Web3 方向有哪些工作,需要掌握哪些知识呢?

作者&#xff1a;0xrayyu 在Web3方向工作需要掌握的知识 投身Web3行业&#xff0c;无论您选择何种岗位&#xff0c;都需要构建一套涵盖基础理论、核心技术、生态应用与前沿趋势的知识体系。本文将对Web3工作者所需的整体知识进行阐述&#xff0c;并针对不同岗位的专业技能进行…

【论文阅读】互连网络的负载平衡路由算法 (CQR, Channel Queue Routing 通道队列路由)

Channel Queue Routing (CQR) 通道队列路由 1. Channel Queue Routing (CQR) 的动机 (1) 排队论(queueing theory)模型(2) GAL’s latency on tornado traffic(3) Routing tornado traffic with CQR 2. Channel Queue Routing 通道队列路由3. CQR 的性能4. 总结 Channel Queu…

滑动窗口DWA_planner

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言(1)DWA_planner算法基本原理1.DWA_planner图例2.DWA_planner输入输出3.DWA算法过程(直观理解)4.DWA_planner源码的主要接口及原理(2)move_ba…

Rust特征

一、Rust特征是什么、怎么用 1、Rust特征是什么 我认为Rust特征和Java中的接口类似&#xff0c;但是扩展了语义 特征定义了一组可以被共享的行为&#xff0c;只要实现了特征&#xff0c;你就能使用这组行为 2、Rust特征怎么使用 &#xff08;1&#xff09;特征定义 pub tra…

白话机器学习1:分类问题中的评价指标

机器学习中的评价指标非常多&#xff0c;它们用来衡量模型的性能和预测能力。不同类型的机器学习任务可能需要不同的评价指标。以下是一些常见的评价指标&#xff0c;按照不同类型的机器学习任务分类&#xff1a; 对于分类问题&#xff1a; 准确率&#xff08;Accuracy&#…

[NeurIPS-23] GOHA: Generalizable One-shot 3D Neural Head Avatar

[pdf | proj | code] 本文提出一种基于单图的可驱动虚拟人像重建框架。基于3DMM给粗重建、驱动结果&#xff0c;基于神经辐射场给细粒度平滑结果。 方法 给定源图片I_s和目标图片I_t&#xff0c;希望生成图片I_o具有源图片ID和目标图片表情位姿。本文提出三个分支&#xff1a;…

WPF —— MVVM command如何传递参数

点击按钮把窗体关闭 把页面的控件传递到自定义指令的函数中 FindAncestor 找到该组件的祖先元素 AncestorType{x:Type Window} 祖先元素类型为window CommandParameter 自定义指令传递参数 自定义指令 public class MyCommand : ICommand {public event Ev…

pytorch中创建maskrcnn模型

0.模型输入/输出参数参见 链接: pytorch的mask-rcnn的模型参数解释 核心代码 GeneralizedRCNN(这里以mask-rcnn来解释说明) # 通过输入图像获取fpn特征图,注意这里的backbone不是直接的resnet,而是fpn化后的 features self.backbone(images.tensors) # 由于是mask-rcnn,故而…

SpringCloud系列(10)--Eureka集群原理及搭建

前言&#xff1a;当注册中心只有一个&#xff0c;而且当这个注册中心宕机了&#xff0c;就会导致整个服务环境不可用&#xff0c;所以我们需要搭建Eureka注册中心集群来实现负载均衡故障容错 Eureka架构原理图 1、Eureka集群原理 2、创建Eureka Server端服务注册中心模块 (1)在…

R语言使用sjPlot包优雅绘制回归模型的交互效应图

交互作用效应(p for Interaction)在SCI文章中可以算是一个必杀技&#xff0c;几乎在高分的SCI中必出现&#xff0c;因为把人群分为亚组后再进行统计可以增强文章结果的可靠性&#xff0c;进行可视化后可以清晰的表明变量之间的关系。不仅如此&#xff0c;交互作用还可以使用来进…

Dockerfile实战(SSH、Systemctl、Nginx、Tomcat)

目录 一、构建SSH镜像 1.1 dockerfile文件内容 1.2 生成镜像 1.3 启动容器并修改root密码 二、构建Systemctl镜像 2.1 编辑dockerfile文件 ​编辑2.2 生成镜像 2.3 启动容器&#xff0c;并挂载宿主机目录挂载到容器中&#xff0c;然后进行初始化 2.4 进入容器验证 三、…

妙手解迭:React Store数据迭代难题

在 React 中&#xff0c;当 store 中的数据无法迭代时,可以尝试以下几种方案: 检查数据结构 首先,请检查 store 中的数据结构是否符合预期。如果数据结构是一个普通对象而不是数组或者其他可迭代对象,那么无法直接使用 for...of 或 for...in 等方式进行迭代。 使用 Object.k…