树的遍历方式DFS和BFS

DFS(depth first search) 深度优先遍历

从图中一个未访问的顶点V开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路走到底…不断递归重复这个过程,直到所有的顶点都遍历完成。前序遍历,还是中序遍历,亦或是后序遍历,都属于深度优先遍历。

树是图的一种特例(连通无环的图就是树),接下来我们来看看树用深度优先遍历该怎么遍历。
在这里插入图片描述

1、我们从根节点 1 开始遍历,它相邻的节点有 2,3,4,先遍历节点 2,再遍历 2 的子节点 5,然后再遍历 5 的子节点 9。

在这里插入图片描述

2、上图中一条路已经走到底了(9是叶子节点,再无可遍历的节点),此时就从 9 回退到上一个节点 5,看下节点 5 是否还有除 9 以外的节点,没有继续回退到 2,2 也没有除 5 以外的节点,回退到 1,1 有除 2 以外的节点 3,所以从节点 3 开始进行深度优先遍历,如下

在这里插入图片描述

3、同理从 10 开始往上回溯到 6, 6 没有除 10 以外的子节点,再往上回溯,发现 3 有除 6 以外的子点 7,所以此时会遍历 7
在这里插入图片描述

3、从 7 往上回溯到 3, 1,发现 1 还有节点 4 未遍历,所以此时沿着 4, 8 进行遍历,这样就遍历完成了

完整的节点的遍历顺序如下(节点上的的蓝色数字代表)
在这里插入图片描述

1.递归实现

   public void dfs(TreeNode root){if (root == null){return;}System.out.println(root.val);dfs(root.left);dfs(root.right);}

存在的问题:如果层次太深,容易造成栈溢出

2.非递归实现

1.使用栈实现,对于每个节点,先遍历当前节点,然后吧右节点压栈,再压左节点。
2.弹栈,每弹出一个,重复1
每弹出一个节点,将这个节点的右节点和左节点放入栈,直到栈为空。

public  void dfsTest02(TreeNode treeNode){if (treeNode == null){return;}Stack<TreeNode> stack = new Stack<>();stack.add(treeNode);while (!stack.isEmpty()){TreeNode peek = stack.pop();System.out.println(peek.val);if (peek.right != null){stack.add(peek.right);}if (peek.left != null){stack.add(peek.left);}}
}

在这里插入图片描述

BFS(breath first search) 广度优先遍历/层序遍历

使用队列来实现,每次访问到的节点放入队列里面,每次从队头取一个节点,并将这节点的所有子节点存入队列,直到队列为空

   public  void bfs(TreeNode root){if (root == null){return;}Queue<TreeNode> queue = new LinkedList<>();queue.add(root);while (!queue.isEmpty()){TreeNode target = queue.poll();System.out.println(target.val);if (target.left != null){queue.add(target.left);}if (target.right != null){queue.add(target.right);}}}
```![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/dd1936b985e54c4db9f146d436ea4c61.png)

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

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

相关文章

前端框架前置课(1)---AJAX阶段

1. AJAX入门 1.1 AJAX概念和axios使用 1.1.1 什么是AJAX? 1.1.2 怎么用AJAX? 引入axios.js 获取省份列表数据 1.2 认识URL 1.3 URL查询参数 1.4 常用请求方和数据提交 1.5 HTTP协议-报文 1.5.1 HTTP响应状态码 1.5.1.1 状态码&#xff1a;1XX&#xff08;信息&#xff09…

字母在字符串中的百分比

字母在字符串中的百分比 链接:https://leetcode.cn/problems/percentage-of-letter-in-string/description/ 给你⼀个字符串 s 和⼀个字符 letter &#xff0c;返回在 s 中等于 letter 字符所占的 百分比 &#xff0c;向下取整到最接近的百分比。 输⼊&#xff1a;s “foob…

sox命令用法

play input.wav 播放音频 sox input.wav -n stat 查看音频文件信息 soxi input.wav 查看音频文件信息input sox input.wav -n stat -v 不失真最大调整量 sox -v 0.8 input.wav output.wav 调整音量0.8,&#xff08;大于1为扩大&#xff0c;小于1为缩小&#xff09; sox *.wav *…

用最小堆实现通用的高效定时器组件

用最小堆实现通用的高效定时器组件 文章目录 用最小堆实现通用的高效定时器组件开篇解决方案类图源码实现测试总结 开篇 在程序开发过程中&#xff0c;定时器会经常被使用到。而在Linux应用开发中&#xff0c;系统定时器资源有限&#xff0c;进程可创建的定时器数量会受到系统限…

力扣爆刷第103天之CodeTop100五连刷1-5

力扣爆刷第103天之CodeTop100五连刷1-5 文章目录 力扣爆刷第103天之CodeTop100五连刷1-5一、3. 无重复字符的最长子串二、206. 反转链表三、146. LRU 缓存四、215. 数组中的第K个最大元素五、25. K 个一组翻转链表 一、3. 无重复字符的最长子串 题目链接&#xff1a;https://l…

计算机软件安全

一、软件安全涉及的范围 1.1软件本身的安全保密 软件的本质与特征&#xff1a; 可移植性 寄生性 再生性 可激发性 攻击性 破坏性 …… 知识产权与软件盗版 软件商品交易形式不透明&#xff0c;方式多样&#xff0c;传统商标标识方法不适用&#xff1b; 盗版方法简捷…

SFML udp通信实例

包含的lib库文件&#xff0c;免得一个一个复制名称&#xff1a; sfml-window-d.lib sfml-system-d.lib sfml-audio-d.lib sfml-graphics-d.lib sfml-main-d.lib sfml-network-d.lib vorbis.lib vorbisenc.lib vorbisfile.lib void runUdpClient(unsigned short port) { /…

【Nginx】配置Nginx以支持主域名和二级域名

生命就像是一场告别 从起点对一切说再见 你拥有的仅仅是伤痕 在回望来路的时候 那天我们相遇在街上 彼此寒暄并报以微笑 我们相互拥抱挥手道别 转过身后已泪流满面 &#x1f3b5; 蔡健雅《当我想你的时候》 Nginx是一款高性能的Web服务器和反向代理服务器…

springboot/ssm本科生交流培养管理平台Java高校课程选课系统web

springboot/ssm本科生交流培养管理平台Java高校课程选课系统web 基于springboot(可改ssm)vue项目 开发语言&#xff1a;Java 框架&#xff1a;springboot/可改ssm vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1…

我的风采——android studio

目录 实现“我的风采”页面要求理论代码生成apk文件 实现“我的风采”页面 要求 要求利用’java框架的边框布局实现“找的风采 ”页而&#xff0c;其中中间为你的生活照&#xff0c;左右和下面为按钮&#xff0c;上面为标签 理论 Java GUI编程是Java程序设计的重要组成部分…

浩哥带你做项目,纯免费教学

浩哥带你做项目 一、YiYi-Web项目开发1. 简介2. 技术栈2.1 后端开发环境2.2 前端开发环境 3.项目截图 二、计算机游戏程序设计&#xff08;基础篇&#xff09;三、RuoYi-Cloud项目学习1.功能介绍2.项目截图 四、鸿蒙应用开发五、软考六、Linux基础知识学习 最近浩哥社区群涌进大…

项目1-加法计算器

1.创建项目 2.导入前端代码 2.1 static包内 2.2 测试前端代码是否有误 显示成功说明无误 2.3 定义用户接口 请求路径&#xff1a;calc/sum 请求方式&#xff1a;GET/POST 接口描述&#xff1a;计算两个整数相加 请求参数: 参数名类型是否必须备注num1Integer是参与计算的第…

JAVA 100道题(16)

16.编写一个程序&#xff0c;尝试打开一个不存在的文件&#xff0c;并捕获可能抛出的异常。 在Java中&#xff0c;你可以使用try-catch块来捕获和处理异常。下面是一个示例程序&#xff0c;尝试打开一个不存在的文件&#xff0c;并捕获FileNotFoundException异常&#xff1a; j…

面试宝典:MySQL中索引为什么使用B+树的深度分析

在高级数据库开发和优化的面试中&#xff0c;索引的结构和原理是一个绕不开的话题。MySQL中&#xff0c;B树是最常见的索引结构&#xff0c;它在性能和效率上都具有显著的优势。本文将深入分析为什么MySQL的索引选择使用B树&#xff0c;以及B树的特性如何使其成为数据库索引的理…

7.Java并发编程—掌握线程池的标准创建方式和优雅关闭技巧,提升任务调度效率

文章目录 线程池的标准创建方式线程池参数1.核心线程(corePoolSize)2.最大线程数(maximumPoolSize)3.阻塞队列(BlockingQueue) 向线程提交任务的两种方式1.execute()1.1.案例-execute()向线程池提交任务 2.submit()2.1.submit(Callable<T> task)2.2.案例-submit()向线程池…

PMP适合哪些人?考试PMP有什么职业要求吗?

威班PMP 3A路过拿证学员 。PMP认证没听说过有啥职业的要求&#xff0c;也没听说过限制在哪些行业可用&#xff0c;根据我考后经验所了解&#xff0c;它并不只作用在某一个领域&#xff0c;知识点也是项目管理相关的工作都能用到&#xff0c;毕竟这些都是通用的专业实践。如果非…

Spring Boot应用程序中如何优化Undertow的性能?

在Spring Boot应用程序中优化Undertow的性能,可以通过调整Undertow的配置参数来实现。以下是一些常见的优化策略: 1. 调整线程池设置 Undertow使用两个线程池:IO线程池和工作线程池(worker threads)。IO线程池负责处理非阻塞操作,而工作线程池处理阻塞操作。 io-thread…

ChatGPT论文指南|总结7个ChatGPT学术论文润色与评价好用的口诀!【建议收藏】

点击下方▼▼▼▼链接直达AIPaperPass &#xff01; AIPaperPass - AI论文写作指导平台 公众号原文▼▼▼▼&#xff1a; ChatGPT论文指南|分享13个学术论文写作ChatGPT口诀&#xff01;【建议收藏】 目录 1.论文润色 2.论文评价 3.书籍介绍 AIPaperPass智能论文写作平…

pytorch 实现多层神经网络MLP(Pytorch 05)

一 多层感知机 最简单的深度网络称为多层感知机。多层感知机由 多层神经元 组成&#xff0c;每一层与它的上一层相连&#xff0c;从中接收输入&#xff1b;同时每一层也与它的下一层相连&#xff0c;影响当前层的神经元。 softmax 实现了 如何处理数据&#xff0c;如何将 输出…

web前端(3.16笔记 html 标签)

一、标签&#xff1a; 语法规范&#xff1a;<标签名 属性名"属性值">标签体</标签名> 标签之间可以嵌套 属性&#xff1a;属性&#xff1a;定制元素的行为的。属性是不通用的&#xff0c;每一个标签存在自身的属性 标签的分类&#xff1a; 行内…