树的遍历方式DFS和BFS

news2024/11/18 5:36:58

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.coloradmin.cn/o/1541691.html

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

相关文章

高可用、逻辑保护、容灾、多活、妥协、流程

可用性三叉戟&#xff1a; 本地高可用性&#xff1a;消除单点故障&#xff0c;确保链路所有环节系统高可用 本地是指&#xff1a;针对生产中心的内部故障 故障类型&#xff1a;服务器、硬盘、适配器卡、网络 特点&#xff1a;快速恢复、自动的接管、实施简单 RPO-0 业务逻辑保护…

栈、队列——练习题

1. ✌有效的括号 代码实现&#xff1a; bool isValid(char* s) {char stack[10000];int top -1;while (*s) {if (*s ( || *s { || *s [) {stack[top] *s;} else {if (top -1) { // 栈空return false;}int top_val stack[top]; // 获取栈顶元素if (top_val ( &&…

遥感原理与应用—绪论

一、关于基本概念与对应的英文 遥感&#xff1a;Remote Sensing 遥测&#xff1a;Telemetry&#xff0c;对被测物体某些运动参数和性质进行远距离测量的技术&#xff0c;分为接触测量与非接触测量&#xff0c;对于RS的概念&#xff0c;遥测探测的目标显得狭隘了一些&#xff…

快速修复找不到msvcp140.dll,无法继续执行此代码问题

在电脑使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“无法找到msvcp140.dll”的错误。那么&#xff0c;msvcp140.dll究竟是什么呢&#xff1f;它为什么会出现这样的错误呢&#xff1f;通过查阅资料和自己的实践经验&#xff0c;我对msvcp140.dll…

需求分析的过程

需求分析的工具 ominGraffle/Visio Gliffy ProcessOn RSA(UML) PPT/WORD 手绘 需求所需要的工件&#xff1a; 系统上下文、用例模型、质量限制 1.系统上下文的工件 2.用例模型工件&#xff08;什么功能&#xff09; 3.质量和限制 质量&#xff1a;管理10个小动物&#xff0c;…

Affiliate Stores: 建立营销联盟商店的详细教程- US Domain Center主机

第一步&#xff1a;了解营销联盟商店 营销联盟商店是一种电子商务模式&#xff0c;您可以在其中通过推广其他企业的产品或服务来赚取佣金。您在自己的网站上展示其他企业的产品&#xff0c;并在买家购买时获得佣金。通过 WooCommerce 平台&#xff0c;您可以轻松创建一个营销联…

C++ 基本运算

何谓运算符和操作数 基本运算 1、双目运算 2、单目运算 3、赋值表达式 表达形式&#xff1a; <变量><表达式>; 表达式是指各种运算符把常量、变量&#xff0c;函数等运算对象连接起来的具有实际意义并符合C语法规则的式子。赋值是指表达式的值赋给一个变量。 …

第390场 LeetCode 周赛题解

A 每个字符最多出现两次的最长子字符串 滑动窗口&#xff1a;枚举窗口的左边界&#xff0c;尽可能右移窗口的右边界。 (当然也可以暴力枚举) class Solution { public:int maximumLengthSubstring(string s) {vector<int> cnt(26);int res 0;for (int l 0, r -1, n s…

自媒体洗稿软件文心一言api洗稿软件介绍

大家好&#xff0c;我是淘小白~ 这几天给一个客户写了一个文心一言api洗稿的软件。 一、客户要求&#xff1a; 1、采集头条文章&#xff08;软件内置可采集头条文章网址、微信文章网址、搜狐文章网址&#xff09; 2、调用文心一言api 3、多线程并发 4、逐段改写文章 5、…

MSDS认证流程与亚马逊MSDS注意事项

MSDS认证流程与亚马逊MSDS注意事项 一、MSDS认证流程概述 MSDS&#xff0c;即物质安全数据表&#xff08;Material Safety Data Sheet&#xff09;&#xff0c;是一份详细描述化学物质或制剂的物理、化学、毒性、环保和处置等方面信息的文件。对于在亚马逊等电商平台上销售的化…

覃超老师 算法面试通关40讲

教程介绍 无论是阿里巴巴、腾讯、百度这些国内一线互联网企业&#xff0c;还是 Google、Facebook、Airbnb 等硅谷知名互联网公司&#xff0c;在招聘工程师的过程中&#xff0c;对算法和数据结构能力的考察都是重中之重。本课程以帮助求职者在短时间内掌握面试中最常见的算法与…

基于SpringBoot+Vue健身房管理系统(源码+部署说明+演示视频+源码介绍)

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通…

探索超净实验室:高纯电子级PFA洗瓶特氟龙材质清洗瓶的特性

PFA洗瓶&#xff0c;实验中常用的清洗工具之一&#xff0c;是一个带有弯曲管状喷嘴的柔性瓶子&#xff0c;因此可以用手挤压瓶身以产生压力&#xff0c;迫使瓶内液体通过塑料管以单滴或窄流的形式流到需要清洁的表面。 ​ 由于需要多次挤压&#xff0c;瓶体要有良好的回弹性和…

jmeter链路压测

比如登录后返回token&#xff0c;业务打印上传的操作需要用到token 线程组中添加登录请求&#xff0c;并执行 1、添加登录并执行&#xff0c;查看结果 2、结果树中下拉选择正则表达式&#xff0c;将token参数和值复制粘贴到下方&#xff0c;将token值改为(.*?)&#xff0…

P - Beat

题目分析 1.看数据范围&#xff0c;大概知道dfs能做 2.自0问题开始查找&#xff0c;确保之后每次查找到的问题的困难度均大于上一次 3.遍历所有情况再记录cnt即可 代码 #include <iostream> #include <algorithm> #include <cstdio> #include <cstring&…

蓝桥杯 2023 省A 颜色平衡树

树上启发式合并是一个巧妙的方法。 dsu on tree&#xff0c;可以称为树上启发式合并&#xff0c;是一种巧妙的暴力。用一个全局数组存储结果&#xff0c;对于每棵子树&#xff0c;有以下操作&#xff1a; 先遍历轻儿子&#xff0c;处理完轻儿子后将数组清零&#xff08;要再…

基于Java中的SSM框架实现快餐店线上点餐系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现快餐店线上点餐系统演示 摘要 随着计算机互联网的高速发展。餐饮业的发展也加入了电子商务团队。各种网上点餐系统纷纷涌现&#xff0c;不仅增加了商户的销售量和营业额&#xff0c;而且为买家提供了极大的方便&#xff0c;足不出户&#xff0c;就能订…

【机器学习300问】50、什么是基于用户的协同过滤算法?

一、 基于用户的协同过滤算法直观感受 假设你在一家大型书店&#xff0c;店主不仅知道你过去的购买记录&#xff0c;还了解其他所有顾客的购买行为。当你要寻找下一本喜欢的书籍时&#xff0c;店主不是根据书籍本身的属性来推荐&#xff08;比如作者、类型&#xff09;&#xf…

RPC 快速入门

一、What 1&#xff09;小故事 张三和李四都在同一个家公司负责商品交易的模块&#xff0c;两个人平时开发甚是紧密。 &#x1f64b;&#x1f3fb;‍♂️ 张三&#xff1a;“李四&#xff0c;我这边一个商品下单了&#xff0c;但是付款数额不对&#xff0c;你帮我查下支付有没…

【应用笔记】LAT1305+使用STM32+TT类型IO的注意事项

1. 概述 在 STM32 系列 MCU 中&#xff0c; 除了一些特殊管脚外&#xff0c;绝大多数管脚都可以分类为 FT (兼容5V 信号)或 TT&#xff08;兼容 3V3 信号&#xff09;类型的 IO&#xff0c;由于 MCU 内部设计的不同&#xff0c; TT IO 相比 5V IO 有更多的限制&#xff0c;下面…