树的广度优先遍历与深度优先遍历算法

2023-11-19

1 树的广度优先遍历算法
广度优先遍历算法,又叫宽度优先遍历,或横向优先遍历,是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。
得到
如上图所示的二叉树,A 是第一个访问的,然后顺序是 B、C,然后再是 D、E、F、G。
那么,怎样才能来保证这个访问的顺序呢?
借助队列数据结构,由于队列是先进先出的顺序,因此可以先将左子树入队,然后再将右子树入队。
这样一来,左子树结点就存在队头,可以先被访问到。

//广度优先遍历

void breadthFirstTravel(Node* root){
queue<Node *> nodeQueue;  //使用C++的STL标准模板库
    nodeQueue.push(root);
    Node *node;
    while(!nodeQueue.empty()){
        node = nodeQueue.front();
        nodeQueue.pop();
        printf(format, node->data);
        if(node->lchild){
            nodeQueue.push(node->lchild);  //先将左子树入队
        }
        if(node->rchild){
            nodeQueue.push(node->rchild);  //再将右子树入队
        }
    }
}

2 树的深度优先遍历算法
深度优先遍历算法是遍历算法的一种。是沿着树的深度遍历树的节点。

当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。

如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
这里写图片描述
如上图所示的二叉树:

A 是第一个访问的,然后顺序是 B、D,然后是 E。接着再是 C、F、G。

那么,怎么样才能来保证这个访问的顺序呢?

分析一下,在遍历了根结点后,就开始遍历左子树,最后才是右子树。

因此可以借助堆栈的数据结构,由于堆栈是后进先出的顺序,由此可以先将右子树压栈,然后再对左子树压栈,

这样一来,左子树结点就存在了栈顶上,因此某结点的左子树能在它的右子树遍历之前被遍历。

//深度优先遍历

void depthFirstTravel(Node* root){
    stack<Node *> nodeStack;  //使用C++的STL标准模板库
    nodeStack.push(root);
    Node *node;
    while(!nodeStack.empty()){
        node = nodeStack.top();
        printf(format, node->data);  //遍历根结点
        nodeStack.pop();
        if(node->rchild){
            nodeStack.push(node->rchild);  //先将右子树压栈
        }
        if(node->lchild){
            nodeStack.push(node->lchild);  //再将左子树压栈
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树的广度优先遍历与深度优先遍历算法 的相关文章

  • Gavin Wood Web3峰会最新演讲:波卡不是智能合约平台,而是平台的平台(全文)...

    在波卡上 每个平台都在用高性能 高效率和最优的方式做着自己擅长的事 而不必让它们的用户用底层平台的货币进行支付 从而将可定制性和灵活性提高了一个台阶 本文谨代表作者个人观点 不代表火星财经立场 该内容旨在传递更多市场信息 不构成任何投资建议
  • WingIDE-配色方案(个人喜好)

    依次选择 Edit gt Preferences gt User Interface gt Color Palette 然后选择自己喜欢的主题 我目前比较喜欢的是 Monokai 当然如果自己觉得不好看 可以依据自己喜好配色
  • VScode扩展商店不显示插件问题

    VScode扩展商店不显示插件问题 情况一 代理服务器异常 参考文章 https blog csdn net wodebokecsdn article details 89239769 文件 首选项 设置 应用程序 代理服务器 情况二 设备

随机推荐

  • rslidar-sdk安装编译以及遇到的问题和解决

    rslidar sdk的安装编译 可以参考官方提供的方法 rslidar sdk 1 1 通过Git下载 git clone https github com RoboSense LiDAR rslidar sdk git cd rslid
  • 计算机中api-ms-win-crt-runtime-l1-1-0.dll丢失怎么解决

    我们在电脑上安装软件或者游戏时 可能会遇到api ms win crt runtime l1 1 0 dll丢失 错误甚至找不到等情况 从而直接导致程序或者游戏无法启动 遇到这种问题别慌 可能有些朋友会绝对是软件安装或游戏安装失败 其实并不
  • Python制作yys彻底解放双手(代码篇)

    我看到好多人想要具体的代码 但是我希望你抱着学习的心态来做这件事情 写该脚本的意义是为了更好的学习python语言而不是进行游戏 千万不要本末倒置 文章相关的问题 1 qt界面如下 在这里只要点击开始按键就可以自动进行三张图片的对比 开始
  • 如何保持缓存和数据库中的数据一致

    背景 缓存是软件开发中一个非常有用的概念 数据库缓存更是在项目中必然会遇到的场景 而缓存一致性的保证 更是在面试中被反复问到 这里进行一下总结 针对不同的要求 选择恰到好处的一致性方案 缓存是什么 存储的速度是有区别的 缓存就是把低速存储的
  • STM32_GPIO引脚控制(库函数开发)

    目录 在学习GPIO引脚前 先介绍一些函数 库函数 stm32f10x rcc 库函数 stm32f10x gpio 这些函数怎么用呢 那如何使用 完成初始化 初始化完成后便可以进行一些GPIO的一些操作了 如 点亮共阳极LED 如 进行L
  • JavaScript 之 Symbol 数据类型

    一 简介 symbol类型是ES6新引入的一种基本数据类型 该类型具有静态属性和静态方法 其中静态属性暴露了几个内建的成员对象 静态方法暴露了全局的symbol注册 symbol类型具有以下特点 唯一性 每个symbol值都是唯一的 不可变
  • 使用git restore --staged撤销你在暂存区的提交

    我们通过git add命令将文件提交到暂存区之后 发现文件提交错了 就可以通过git restore staged撤销在暂存区提交的文件 通过实例演示一下 当前目录下有三个文件进行了修改 并提交到了暂存区 通过git ls files命令可
  • 以太坊系列之十五: 以太坊数据库

    以太坊数据库中都存了什么 以太坊使用的数据库是一个NOSQL数据库 是谷歌提供的开源数据leveldb 这里尝试通过分析以太坊数据库存储了什么来分析以太坊可能为我们提供哪些关于区块链的API 存储内容 NOSQL是一个key value数据
  • MetaEditor 编译原理之MQ4文件语法解析

    语法解析 顾名思义就是将一个文件或者一段代码 按照语法结构拆分为一个一个的单词 比如 extern int TakeProfit 50 int start int i 0 while i lt TakeProfit i return i 正
  • (附源码)springboot电商系统前端界面设计与浏览器兼容性研究 毕业设计 231058

    基于springboot电商系统前端界面设计 摘 要 随着科学技术的飞速发展 各行各业都在努力与现代先进技术接轨 通过科技手段提高自身的优势 对于电商系统前端界面设计与浏览器兼容性研究当然也不能排除在外 随着网络技术的不断成熟 带动了电商系
  • 运行软件mfc140u.dll丢失怎么办?mfc140u.dll的三个修复方法

    最近我在使用一款软件时遇到了一个问题 提示缺少mfc140u dll文件 这个文件是我在使用某个应用程序时所需要的 但是由于某种原因 它变得无法正常使用了 经过一番搜索和了解 我了解到mfc140u dll是Microsoft Visual
  • Proteus8仿真:51单片机A/D转换(ADC0808)

    51单片机A D转换 元器件 原理图部分 代码 main c 工程文件 元器件 元器件 名称 排阻 RESPACK 8 51单片机 AT89C51 数码管 7SEG MPX4 CA BLUE ADC芯片 ADC0808 滑动变阻器 POT
  • Centos设置limit最大打开文件数和最大进程数

    在 etc security limits conf添加 cat gt etc security limits conf lt
  • 【Ruff学习1】Ruff是一个物联网的操作系统,可以让开发者使用JS高效且迅速地开发物联网应用

    Ruff学习1 Ruff是一个物联网的操作系统 可以让开发者使用JS高效且迅速地开发物联网应用 官网 三分钟 点亮物联网世界的第一盏灯 ready function btn on push function led turnOn Ruff特
  • css ol 序列样式:数字带圆圈、括号

    有序ol基本的网上都有 在这里就不介绍了 1 数字带登号 如标题的这种 2 通过上面的例子可以扩展一下 1 只要修改成下面的代码 其余不变 ol li before content counter sectioncounter counte
  • K8S存储之volume

    K8S存储之volume 容器磁盘上的文件的生命周期是短暂的 这就使得在容器中运行重要应用时会出现一些问题 首先 当容器崩溃时 kubelet会重启它 但是容器中的文件将丢失一一容器以干净的状态 镜像最初的状态 重新启动 其次 在Pod中同
  • 【Python】Jupyter Notebook无法运行代码,不可重命名且提示error和自动保存失败时如何操作?

    Python Jupyter Notebook无法运行代码 且提示error和自动保存失败时如何操作 Anaconda的Jupyter Notebook作为优秀的网页编辑器 非常适用于编写Python程序 但往往可能因安装版本不兼容等原因而
  • Flutter中的依赖注入——get_it

    Flutter社区的一个library get it 视频介绍 Flutter Dependency Injection For Beginners Complete Guide 视频对应的博文 Dependency Injection i
  • JavaWeb开发中出现DataSource读取不到怎么办呢?(详细,适合初入门的程序员)

    这样的问题是怎么产生的呢 其实啊也不难 来吧 跟我走一遍 目录 前言 二 使用步骤 1 基本的JavaWeb项目的结构 1 1 创建一个JavaWeb项目 1 2 配置文件的配置 1 3 重点来了 2 DBUtil的代码内容 3 测试 总结
  • 树的广度优先遍历与深度优先遍历算法

    1 树的广度优先遍历算法 广度优先遍历算法 又叫宽度优先遍历 或横向优先遍历 是从根节点开始 沿着树的宽度遍历树的节点 如果所有节点均被访问 则算法中止 如上图所示的二叉树 A 是第一个访问的 然后顺序是 B C 然后再是 D E F G