二叉树之遍历

概述

        之前有说到二叉树的建树,这次讲讲二叉树的遍历过程。二叉树的遍历分为深度优先遍历和广度优先遍历,二叉树的逻辑结构如下所示:

class TreeNode{int val;TreeNode left;TreeNode right;public TreeNode(){}public TreeNode(int val){this.val = val;}
}

        本文将用示例来详细描述二叉树深度优先遍历中后序遍历以及层序遍历的详细过程,而二叉树的前序遍历和中序遍历与前序遍历类似,就不再展开阐述。示例如下图所示。
请添加图片描述

深度优先遍历

        根据父结点的遍历顺序的不同,分为如下三种遍历。

  • 前序遍历:先遍历父结点,之后是左节点,最后是右结点。
  • 中序遍历:先遍历左结点,之后是父结点,最后是右结点。
  • 后序遍历:先遍历左节点,之后是右节点,最后是父结点。
前序遍历
List<Integer> res = new ArrayList<>();
public List<Integer> preorderTraversal(TreeNode root) {Tarversal(root);return res;
}
void Tarversal(TreeNode root){if(root == null) return;res.add(root.val);Tarversal(root.left);Tarversal(root.right);
}
中序遍历
List<Integer> res = new ArrayList<>();
public List<Integer> inorderTraversal(TreeNode root) {Tarversal(root);return res;
}
void Tarversal(TreeNode root){if(root == null) return;Tarversal(root.left);res.add(root.val);Tarversal(root.right);
}
后序遍历
List<Integer> res = new ArrayList<>();
public List<Integer> postorderTraversal(TreeNode root) {Tarversal(root);return res;
}
void Tarversal(TreeNode root){if(root == null) return;Tarversal(root.left);Tarversal(root.right);res.add(root.val);
}

        首先,根结点为1,不为空,进入根结点的left,即2结点,结点2不为空,进入结点2的left,结点2的左结点为空返回,进入结点2的右结点为空返回,结点2左右子结点Tarversal遍历结束,将结点2放入res中,结点2的Tarversal方法遍历完成,回到根结点1的Tarversal方法继续递归根结点1的right,结点3不为空,进入结点3的left,结点4不为空,进入结点4的left,结点4的left为空返回,进入结点4的right为空返回,将结点4加入res中,返回结点3的right,结点5不为空,进入结点5的left为空返回,进入结点5的right为空返回,将结点5加入res中,返回结点3,结点的左右子结点递归结束,将结点3加入res中,返回结点1,结点1左右子结点递归结束,将结点1加入res中,后序遍历整个过程完成。

广度优先遍历(层序遍历)

public List<List<Integer>> bfs(TreeNode root) {List<List<Integer>> ans = new ArrayList<>();Deque<TreeNode> queue = new ArrayDeque<>();if(root == null) return ans;queue.offer(root);while(!queue.isEmpty()){int size = queue.size();List<Integer> list = new ArrayList<>();for(int i = 0;i < size;i++){TreeNode node = queue.poll();list.add(node.val);if(node.left != null){queue.offer(node.left);}    if(node.right != null){queue.offer(node.right);}}ans.add(list);}return ans;
}

        该代码中巧妙之处在于用队列的大小,即size来控制二叉树的每层树结点个数,进而得到每层的遍历结果。首先判断根结点是否为空,显然根节点为1不为空,将根结点放入队列中,之后,开始进行外层while循环判断,队列是否为空,显然不为空,获取队列的大小为1,仅有一个根节点,创建一个存放每层元素的队列list,之后进入第二层for循环,将根结点1弹出并加入队列中,之后判断根结点的左右结点是否为空,都不为空,将左结点2和右结点3加入队列中,for循环结束,list中仅存放根结点,将list放入ans中。继续外层while循环,判断队列不为空,有两个元素2和3,因此size等于2,第二层for循环两次,重新创建一个放第二层元素的list,进入内层for循环,将2弹出并加入list中,判断2的左右结点,都为空,什么也不做,继续将结点3弹出并加入list中,判断结点3是否为空,左右结点都不为空,将左结点4和右结点5加入队列中,第二层for循环结束,list中存放元素2和3,将list放入ans中。外层循环while判断队列是否为空,不为空,有结点4和5,size为2,第二层for循环遍历2次,重新创建一个放第三层元素的list,进入内层for循环,将结点4弹出并加入list中,判断结点4左右结点是否为空,为空,什么也不做,弹出结点5并加入list中,判断结点5左右结点是否为空,为空,什么也不做,内层for循环结点,将list放入ans中,此时队列为空,外层while循环结束,就此得到了层序遍历的所有结果。

实战

  • 二叉树的前序遍历
  • 二叉树的中序遍历
  • 二叉树的后序遍历
  • 二叉树的层序遍历
  • 二叉树的层序遍历II
  • 二叉树的锯齿形层序遍历

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

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

相关文章

dPET论文笔记

PBPK论文笔记 题目&#xff1a;Self-supervised Learning for Physiologically-Based Pharmacokinetic Modeling in Dynamic PET 摘要 动态正电子发射断层扫描成像 &#xff08;dPET&#xff09; 提供示踪剂的时间分辨图像。从 dPET 中提取的时间活动曲线 &#xff08;TAC&a…

C#如何快速读取大型文本文件?StreamReader+FileStream

FileStream读取字节流, StreamReader则是用于从字节流中读取文本数据并进行解码。 FileStream用于打开文件流&#xff0c;提供了对文件的底层访问&#xff0c;它读取的是字节流。 StreamReader用于从字节流中读取文本数据&#xff0c;并根据指定的编码&#xff08;或使用默认编…

题目:一个最优美的图案。

题目&#xff1a;一个最优美的图案。    There is no nutrition in the blog content. After reading it, you will not only suffer from malnutrition, but also impotence. The blog content is all parallel goods. Those who are worried about being cheated should l…

Spring Boot统一功能处理(一)

本篇主要介绍Spring Boot的统一功能处理中的拦截器。 目录 一、拦截器的基本使用 二、拦截器实操 三、浅尝源码 初始化DispatcherServerlet 处理请求&#xff08;doDispatch) 四、适配器模式 一、拦截器的基本使用 在一般的学校或者社区门口&#xff0c;通常会安排几个…

(我的创作纪念日)[MySQL]数据库原理7——喵喵期末不挂科

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

软考系统架构设计师考试论文应试技巧

写论文是你展示系统分析水平的最佳时机&#xff0c;如果您面对三个论文问题的阐述&#xff0c;怎么才能让人相信你有项目实践经验&#xff0c;有较强的分析问题、解决问题的能力&#xff0c;怎么才能让你的论文就很有说服力呢&#xff1f;下面是湖北软考网小编总结出来的几条系…

无酒不水浒,无肉不江湖

很难想象&#xff0c;没有酒的《水浒传》&#xff0c;将会是什么样儿&#xff1f; 武松醉打蒋门神&#xff0c;小霸王醉入销金帐、杨雄醉骂潘巧云&#xff0c;诸如此类&#xff0c;都是水浒传中经典的酒故事&#xff0c;倘若离开了酒&#xff0c;水浒少的就不仅仅是故事了&…

头歌-机器学习实验 第8次实验 决策树

第1关&#xff1a;什么是决策树 任务描述 本关任务&#xff1a;根据本节课所学知识完成本关所设置的选择题。 相关知识 为了完成本关任务&#xff0c;你需要掌握决策树的相关基础知识。 引例 在炎热的夏天&#xff0c;没有什么比冰镇后的西瓜更能令人感到心旷神怡的了。现…

【nnUNetv2进阶】三、nnUNetv2 自定义网络-发paper必会

nnUNet是一个自适应的深度学习框架,专为医学图像分割任务设计。以下是关于nnUNet的详细解释和特点: 自适应框架:nnUNet能够根据具体的医学图像分割任务自动调整模型结构、训练参数等,从而避免了繁琐的手工调参过程。 自动化流程:nnUNet包含了从数据预处理到模型训练、验证…

【Linux实践室】Linux高级用户管理实战指南:用户所属组变更操作详解

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️任务描述二. ⛳️相关知识2.1 &#x1f514;Linux查看用户所属组2.1.1 &#x1f47b;使…

《UE5_C++多人TPS完整教程》学习笔记31 ——《P32 角色移动(Character Movement)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P32 角色移动&#xff08;Character Movement&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&…

IntelliJ IDEA 2024 for Mac/Win:引领Java开发新纪元的高效集成环境

在日新月异的软件开发领域&#xff0c;一款高效、智能的集成开发环境&#xff08;IDE&#xff09;无疑是程序员们不可或缺的神兵利器。今天&#xff0c;我要为大家介绍的&#xff0c;正是这样一款集大成之作——IntelliJ IDEA 2024。无论是Mac用户还是Windows用户&#xff0c;只…

全球AI顶会NeurlPS开始收高中生论文了

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 卷高考之后的下一步&#xff0c;卷论文&#xff1f; 培养 AI 人才&#xff0c;要从娃娃抓起&…

Spark-Scala语言实战(16)

在之前的文章中&#xff0c;我们学习了三道任务&#xff0c;运用之前学到的方法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-Scala语言实战&#x…

逆向案例二十五——m3u8中有AES加密怎么处理

网址链接&#xff1a;aHR0cHM6Ly93d3cuY2Jwb3J0YWwub3JnL2N1cGZveHBsYXkvODUyNzctMS0xLw 打开一个视频&#xff0c;打开开发者工具&#xff0c;刷新&#xff0c;搜索m3u8,找到这个含有所有ts连接的包 预览一下&#xff1a; 这与平常的m3u8有所不同&#xff0c;如果有下面的代码…

基于torch的图像识别训练策略与常用模块

数据预处理部分&#xff1a; 数据增强&#xff1a;torchvision中transforms模块自带功能&#xff0c;比较实用数据预处理&#xff1a;torchvision中transforms也帮我们实现好了&#xff0c;直接调用即可DataLoader模块直接读取batch数据 网络模块设置&#xff1a; 加载预训练…

【SQL】数据库SQL语句

1、主键 主键值唯一&#xff0c;不可修改&#xff0c;不能为空&#xff0c;删除不能重用 2、数据类型&#xff08;常用&#xff09; char int float date timestamp 3、select select * from data; select xx,xxx from data;//取部分行 select * from data limit 100; //限…

Bezier曲线的绘制 matlab

式中&#xff1a; 称为基函数。 。 因为n表示次数&#xff0c;点数为n1&#xff0c;显然i表示第i个控制点。 显然在Matlab中可以同矩阵的形式来计算C(u)。 关键代码为&#xff1a; clc clear % 假设控制点P取值为&#xff1a; P [4,7;13,12;19,4;25,12;30,3]; % 因此&a…

vscode debug 配置:launch.json

打开新项目左边的“运行和调试” 点击蓝色字体“创建 launch.json 文件” 选择上方“python” 选择“Python 文件 调试当前正在运行的Python文件” 配置launch.json文件内容&#xff1a; {// 使用 IntelliSense 了解相关属性// 悬停以查看现有属性的描述。// 欲了解更多信息&a…