01 二叉树的BFS(广度、层次或水平遍历实现)【Binary Tree 二叉树】

2023-11-10

二叉树的遍历分为BFS和DFS两种大类
下面完整实现BFS遍历二叉树

 * 例如二叉树
 *      1
 *     / \
 *    2   3
 *   /\
 * 4  5

BFS遍历结果:1-2-3-4-5

具体的代码实现:

方法一、采用递归遍历的方法实现

// Recursive C program for level order traversal of Binary Tree
#include <stdio.h>
#include <stdlib.h>

/* A binary tree node has data, pointer to left child
and a pointer to right child */
struct node
{
    int data;
    struct node* left, *right;
};

/* Function protoypes */
void printGivenLevel(struct node* root, int level);
int height(struct node* node);
struct node* newNode(int data);

/* Function to print level order traversal a tree
 * 方法一:
 * 方法二见05
 * */
void printLevelOrder(struct node* root)
{
    int h = height(root);
    int i;
    for (i=1; i<=h; i++)
        printGivenLevel(root, i);
}

/* Print nodes at a given level */
void printGivenLevel(struct node* root, int level)
{
    if (root == NULL)
        return;
    if (level == 1)
        printf("%d ", root->data);
    else if (level > 1)
    {
        //递归调用
        printGivenLevel(root->left, level-1);
        printGivenLevel(root->right, level-1);
    }
}

/* Compute the "height" of a tree -- the number of
	nodes along the longest path from the root node
	down to the farthest leaf node.*/
int height(struct node* node)
{
    if (node==NULL)
        return 0;
    else
    {
        /* compute the height of each subtree */
        int lheight = height(node->left);
        int rheight = height(node->right);

        /* use the larger one */
        if (lheight > rheight)
            return(lheight+1);
        else return(rheight+1);
    }
}

/* Helper function that allocates a new node with the
given data and NULL left and right pointers. */
struct node* newNode(int data)
{
    struct node* node = (struct node*)
            malloc(sizeof(struct node));
    node->data = data;
    node->left = NULL;
    node->right = NULL;

    return(node);
}

/* Driver program to test above functions*/
int main()
{
    struct node *root = newNode(1);
    root->left	 = newNode(2);
    root->right	 = newNode(3);
    root->left->left = newNode(4);
    root->left->right = newNode(5);

    printf("Level Order traversal of binary tree is \n");
    printLevelOrder(root);

    return 0;
}

输出:

Level Order traversal of binary tree is 
1 2 3 4 5 

方法二、采用先进先出的队列实现

#include <stdio.h>
#include <stdlib.h>
#define MAX_Q_SIZE 500
/*构造树的结点
 * 一个树有一个数据域,一个左孩子指针,一个右孩子指针
 */
struct node {
    int data;
    struct node *left;
    struct node *right;
};

/*几个方法原型*/
struct node **createQueue(int *, int *);//创建一个队列,用双指针
void enQueue(struct node **, int *, struct node *);//第一个参数是双指针
struct node *deQueue(struct node **, int *);//出队

/*创建一个队列,这个队列是以struct node属性的数组存储的
 * 此队列,相当于一个数据类型是struct node的数组
 */
struct node **createQueue(int *front, int *rear) {
    //为队列申请内存,这里用双指针
    struct node **queue = (struct node **) malloc(sizeof(struct node *)*MAX_Q_SIZE);
    //初始化的时候,一定记得*front = *rear处于同一位置
    *front = *rear = 0;
    return queue;
}

/*入队,尾入*/
void enQueue(struct node **queue, int *rear, struct node *new_node) {
    queue[*rear] = new_node;//现将结点放到*rear的位置
    (*rear)++;//加一
}

/*出队,头出*/
struct node *deQueue(struct node **queue, int *front)
{
    (*front)++;
    return queue[*front - 1];
}

/*通过给定的数据域,直接构造一个树的结点*/
struct node * newNode(int data){
    //要构造新节点,首先要想到的就是为结点申请内存
    struct node *node = (struct node *)malloc(sizeof(struct node));
    node->data = data;
    node->left = NULL;
    node->right = NULL;
    return node;
}

/*给一个二叉树,要层次打印出各个结点,通过队列的方式实现*/
void printLevelOrder(struct node* root){
    //定义变量
    int front,rear;
    //创建队列,传地址&
    struct node **queue = createQueue(&front,&rear);
    //创建一个临时的树结点,将root指针指向的结点地址赋值指针temp_node
    //因为root已经是指针类型,所以可以直接赋值
    struct node *temp_node = root;

    //遍历。指针temp_node处的结点存在
    while (temp_node){
        //打印
        printf("%d ",temp_node->data);
        //如果左孩子存在,左孩子入队
        if (temp_node->left){
            enQueue(queue,&rear,temp_node->left);
        }

        //如果右孩子存在,右孩子入队
        if (temp_node->right){
            enQueue(queue,&rear,temp_node->right);
        }

        //出队一个结点指针,使他赋值给temp_node指针
        temp_node = deQueue(queue,&front);
    }
}

/**
 * BFS 广度优先遍历
 * 对于每个树的结点来说:
 * 第一次访问这个结点后,就将这个结点的的孩子结点放入先进先出的队列中
 * @return
 */
int main() {
    //初始化一个根结点
    struct node *root = newNode(1);
    root->left = newNode(2);
    root->right = newNode(3);
    root->left->left = newNode(4);
    root->left->right = newNode(5);
    printf("Level Order traversal of binary tree is \n");
    printLevelOrder(root);
    return 0;
}

输出:

Level Order traversal of binary tree is 
1 2 3 4 5 

以上两种方式,第二种相对来说比较容易理解一些。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

01 二叉树的BFS(广度、层次或水平遍历实现)【Binary Tree 二叉树】 的相关文章

  • 【Leetcode】349. 两个数组的交集

    Leetcode 349 两个数组的交集 题目链接 代码 题目链接 Leetcode 349 两个数组的交集 代码 func intersection nums1 int nums2 int int nums1和nums切片的hash ha
  • 高翔博士Faster-LIO论文和算法解析

    说明 题目 Faster LIO 快速激光IMU里程计 参考链接 Faster LIO 快速激光IMU里程计 iVox Faster Lio 智行者高博团队开源的增量式稀疏体素结构 Faster Lio是高翔博士在Fast系列的新作 对标基
  • 【数位dp】【动态规划】C++算法:233.数字 1 的个数

    作者推荐 动态规划 C 算法312 戳气球 本文涉及的基础知识点 动态规划 数位dp LeetCode 233数字 1 的个数 给定一个整数 n 计算所有小于等于 n 的非负整数中数字 1 出现的个数 示例 1 输入 n 13 输出 6 示
  • D - Loong and Takahashi (经典模拟绕圈)

    题目 https atcoder jp contests abc335 tasks abc335 d 思想 令 flag 0 1 2 3 分别代表四个方向右 下 左 上 然后判断下一步是否超过边界或者被填充过 如果是 就换方向 最后输出 代
  • 华为OD机试真题-字符串拼接-2023年OD统一考试(C卷)

    题目描述 给定M 0
  • 基于粒子群算法的电动汽车充电动态优化策略研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据
  • 【质量-弹簧-阻尼系统】基于脉冲响应约束的子空间辨识研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据 文章
  • 【路径规划】基于A*算法路径规划研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 蒙特卡洛在发电系统中的应用(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 2024年华为OD机试真题-手机App防沉迷系统-Java-OD统一考试(C卷)

    题目描述 智能手机方便了我们生活的同时 也侵占了我们不少的时间 手机App防沉迷系统 能够让我们每天合理的规划手机App使用时间 在正确的时间做正确的事 它的大概原理是这样的 1 在一天24小时内 可注册每个App的允许使用时段 2 一个时
  • 矩阵基本操作3

    题目描述 问题描述 定义一个N M N M lt 100 的矩阵 将一个该矩阵的行和列的元素互换 存到另一个二维数组中 输入格式 一行两个整数 N M 中间用空格隔开 表示矩阵有N行 M列 接下来共N行M列表示矩阵 输出格式 输出转置以后的
  • 矩阵基本操作2

    题目描述 问题描述 将方阵 n 行n列 n lt 100 置成下三角矩阵 主对角线右上角数字全部清零 输入格式 第一行输入n 接下来的n行每行n列 表示矩阵的数值 用空格隔开 输出格式 n行n列下三角矩阵 每个数字3个占位符 左对齐 输入样
  • ​LeetCode解法汇总83. 删除排序链表中的重复元素

    目录链接 力扣编程题 解法汇总 分享 记录 CSDN博客 GitHub同步刷题项目 https github com September26 java algorithms 原题链接 力扣 LeetCode 描述 给定一个已排序的链表的头
  • ​LeetCode解法汇总82. 删除排序链表中的重复元素 II

    目录链接 力扣编程题 解法汇总 分享 记录 CSDN博客 GitHub同步刷题项目 https github com September26 java algorithms 原题链接 力扣 LeetCode 描述 给定一个已排序的链表的头
  • 基于卡尔曼的混合预编码技术用于多用户毫米波大规模MIMO系统研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 【牛客周赛Round 27】题目讲解

    题目一 小红的二进制删数字 小红拿到了一个二进制字符串 s 她可以删掉其中的一些字符 使得最终该字符串为一个2的幂 即可以表示为 2 k 形式的数 小红想知道 自己最少删几个字符可以达成 请你编写一个函数返回这个答案 具体思路 看到这道题目
  • 「优选算法刷题」:移动零

    嗨 这个假期罗根开始接触了算法 在为今年的蓝桥杯做准备 所以 开个新专栏 记录记录自己做算法题时的心得 一 题目 给定一个数组 nums 编写一个函数将所有 0 移动到数组的末尾 同时保持非零元素的相对顺序 请注意 必须在不复制数组的情况下
  • 「优选算法刷题」:快乐数

    一 题目 编写一个算法来判断一个数 n 是不是快乐数 快乐数 定义为 对于一个正整数 每一次将该数替换为它每个位置上的数字的平方和 然后重复这个过程直到这个数变为 1 也可能是 无限循环 但始终变不到 1 如果这个过程 结果为 1 那么这个
  • 用栈实现队列(OJ中报错的处理)

    用栈实现队列 ERROR AddressSanitizer myQueueFree函数中栈的释放处现了问题 没有调用StackDestory而是直接free了 这个是栈初始化时 capacity与malloc申请的空间大小没有匹配 请你仅使
  • 5_机械臂运动学基础_矩阵

    上次说的向量空间是为矩阵服务的 1 学科回顾 从科技实践中来的数学问题无非分为两类 一类是线性问题 一类是非线性问题 线性问题是研究最久 理论最完善的 而非线性问题则可以在一定基础上转化为线性问题求解 线性变换 数域 F 上线性空间V中的变

随机推荐

  • Python实现寻找二叉树中最近的公共祖先

    Python实现寻找二叉树中最近的公共祖先 在二叉树中 我们可以定义节点的父节点为其直接连接上层节点的边 无法访问父节点信息的情况下如何获取两个节点的最低公共祖先呢 我们可以采用递归遍历二叉树的方式进行查找 首先 我们需要定义一个函数来检查
  • 【AntDB数据库】AntDB数据库迁移(二)

    导出导入数据 导出数据 编写配置文件 ora2pg 导出数据的配置文件如下 cat gt shcrm so1 data conf lt lt EOF ORACLE HOME home postgres oracle instantclien
  • 短视频剪辑如何赚钱

    你的问题可真多哈 给你把浓缩一下 就是如何通过短视频赚钱 下面分享一下我的经验 毕竟也做了好几年的自媒体 现在主要做抖音和快手 1 首先回答你第一个问题 短视频剪辑一个月能转多少钱的问题 这个问题肯定没有标准答案 不同人 做不同的视频类型
  • 编译Linux内核时出现“ncurses-devel”错误

    通常在安装完Linux系统后 在编译kernel使用make menuconfig时 可能会出现如下错误 Unable to find the ncurses libraries or the required header files m
  • fedora 27 安装 android studio

    Reference Fedora wiki Android Studio Fedora23 安装Android Studio 在fedora下进行Android studio 安装和前期配置 Android Studio 为Android
  • Python字典的操作小技巧——索引、增添、删除、修改与取键和值

    字典是非常常用的一种数据结构 它与json格式的数据非常相似 核心就是以键值对的形式存储数据 关于Python中的字典做如下四点说明 构造字典对象需要使用大括号表示 即 每一个字典元素都是以键值对的形式存在 并且键值对之间用英文状态下的冒号
  • linux如何复制文件夹和

    CP命令 格式 CP 选项 源文件或目录 目的文件或目录 选项说明 b 同名 备分原来的文件 f 强制覆盖同名文件 r 按递归方式保留原目录结构复制文件 cp r tmp a root a 记得有空格 1 vi filename 打开或新建
  • 【C++】类的前置声明

    两个类要互相引用 就会出现 未定义 尴尬 此时可以用前置声明来解决 class person 类的前置声明 class Animal public void eat person pn class person public friend
  • Qt串口接收一帧不完整问题

    1 串口通信接收不全问题 在触发接收后 调用一次waitForReadyRead 等待100ms 后续再readAll 目前都能完整接收一帧 connect m serialPort SIGNAL readyRead this SLOT r
  • xcode中如何显示文件后缀

    xcode14 3 用不惯mac电脑真恶心 改个显示文件后缀找半天 1 首先双击打开xcode软件 2 此时 电脑左上角出现xcode字样 左上角如果看不到xcode字样 再次点击xcode软件弹出来就有了 鼠标右键它 点击setting或
  • 安装zookeeper详解教程(windows单机版)(以及解决方法)

    1 下载安装包 Apache官网下载 我选的比较稳定的旧版本 地址 Apache ZooKeeperhttps zookeeper apache org releases html 2 解压到本地目录 3 配置文件 进入conf目录下将zo
  • A. Doremy‘s IQ(贪心)

    Problem A Codeforces 题意 一个人的IQ为q 有n场比赛 第i天只能参加第i场比赛 如果比赛难度大于IQ 那么IQ就会下降 如果IQ为0就不能参加比赛了 问最多能参加多少场比赛 输入一个01串 0表示不参加 1表示参加
  • 【nlp-with-transformers】

    今天社群中的小伙伴面试遇到了一个问题 如何保证生成式语言模型在同样的输入情况下可以保证同样的输出 这里面造成问题的因素有两个方面 一个方面是在forward过程中参数的计算出现了差异 这种情况一般发生在游戏显卡中 游戏显卡无法保证每一次底层
  • 基于用户的协同过滤算法(userCF)

    1 定义 userCF 当一个用户A需要个性化推荐时 可以先找到和他有相似兴趣的其他用户 然后把那些用户喜欢的 而用户A没有听说过的物品推荐给A 这种方法称为基于用户的协同过滤算法 基于用户的协同过滤算法主要包括两个步骤 2 第一步 找到和
  • c++ java rgb与nv21互转

    目录 jni函数 c rgb转nv21 可以转 不报错 但是转完只有黑白图 java yuv420保存图片 先转nv21 再保存ok c yuv420月bgr互转 测试ok jni函数 JNIEXPORT void JNICALL Java
  • 一.安装deepin

    笔记本是联想拯救者y7000 原配 cpu i5 8300h 三星内存8g 固态128g 2T机械 独显是nvidia gtx1050ti 后加装16G同品牌同频率内存组24G内存 固态128卸掉换512 伴随着几次win10升级 电脑待机
  • kingbaseES查询数据库里一个模式下所有的表以及大小

    1 例如以public模式为样例 SELECT table name sys size pretty table size AS table size sys size pretty indexes size AS indexes size
  • react usestate 更新_React中setState同步更新策略

    setState 同步更新 我们在上文中提及 为了提高性能React将setState设置为批次更新 即是异步操作函数 并不能以顺序控制流的方式设置某些事件 我们也不能依赖于this state来计算未来状态 典型的譬如我们希望在从服务端抓
  • 静态时序分析——单周期

    一 建立时间的检查 建立时间的检查是指检查电路里每一个触发器的数据和时钟的关系是否满足建立时间的要求 我们以上图为例进行建立时间检查 由图可知 我们主要针对第二个触发器UFF1进行检查 我们可以梳理时序关系如下 通过这个图 我们可以得到满足
  • 01 二叉树的BFS(广度、层次或水平遍历实现)【Binary Tree 二叉树】

    二叉树的遍历分为BFS和DFS两种大类 下面完整实现BFS遍历二叉树 例如二叉树 1 2 3 4 5 BFS遍历结果 1 2 3 4 5 具体的代码实现 方法一 采用递归遍历的方法实现 Recursive C program for lev