【数据结构】【王道】【树与二叉树】二叉树层序遍历实现(可直接运行)

王道数据结构第五章树与二叉树(代码及笔记) 思路:从第一个元素出发,重新进行一次中序遍历,指针q记录当前访问的节点,指针pre记录上一个被访问的节点— --- — 当q == p时,pre为前驱(p为所找元素)4.若删除节点有左子树和右子树,则让左子树最右侧的节点代替自己,然后删除左子树最右侧的节点(让右子树最左侧的节点代替自己,然后删除右子树最右侧的节点)③按层序从1开始,节点i的左孩子为2i,右孩子为2i+1,父节点为。③按层序从1开始,节点i的左孩子为2i,右孩子为2i+1,父节点为。 阅读详情

总目录:https://blog.youkuaiyun.com/treesorshining/article/details/125726400

1.说明

层序遍历即是一层一层从左至右访问二叉树每个结点,类似于广度优先遍历。

实现思路:借助一个辅助队列,从根节点开始,根结点入队,访问此结点后出队,并将此结点的左右孩子入队(如果有),再依次对队头结点执行上述操作,直至队列为空为止。

2.算法实现

// 层序遍历
// 即一层一层从左至右访问每个结点,即广度优先遍历
// 此操作需要一个辅助队列,从根结点开始入队,访问此结点后出队,并将此结点的左右孩子入队(如果有)
// 再对每一个入队结点重复上述操作直至遍历完成(队列空)
void LevelOrder(BiTree T) {
    LinkQueue Q;
    // 初始化辅助队列
    InitQueue(Q);
    BiTree p;
    // 根节点入队
    EnQueue(Q, T);
    // 队列不空则一直循环
    while(!IsEmpty(Q)) {
        // 队头结点出队
        DeQueue(Q, p);
        // 访问出队结点
        visit(p);
        // 访问出队结点
        if(p->lchild != NULL) {
            // 左孩子入队
            EnQueue(Q, p->lchild);
        }
        if(p->rchild != NULL) {
            // 右孩子入队
            EnQueue(Q, p->rchild);
        }
        // 释放空间
        free(p);
    }
}

3.完整代码

#include<stdio.h>
#include<stdlib.h>

typedef struct BiTNode {
    // 数据域
    char data;
    // 左、右孩子指针
    struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

typedef struct LinkNode {   // 链式队列结点
    // 此处存的是指针而不是结点,可节省大量空间
    BiTNode* data;   // 数据域
    struct LinkNode *next;  // 指针域
} LinkNode;

typedef struct {    // 链式队列
    // 如果不设置尾指针,若要插入,遍历到队尾再插入,时间复杂度O(n)
    LinkNode *front, *rear; // 队列的队头和队尾指针
} LinkQueue;

// 初始化
void InitTree(BiTree &T) {
    // 初始化可将根节点置空,空树
    T = NULL;
    // 插入根节点
    // 分配空间
    T = (BiTree)malloc(sizeof(BiTree));
    // 赋值
    T->data = 'A';
    // 初始无左右子树
    T->lchild = NULL;
    T->rchild = NULL;
}

// 左插入结点
bool InsertLeftTreeNode(BiTNode* &T, char x) {
    // 分配空间
    BiTNode *p = (BiTNode*)malloc(sizeof(BiTNode));
    // 分配空间失败的情况
    if(p == NULL) {
        return false;
    }
    // 数据域赋值
    p->data = x;
    // 初始插入,无左右孩子,置空
    p->lchild = NULL;
    p->rchild = NULL;
    // 作为指定插入结点的左孩子
    T->lchild = p;
    return true;
}

// 右插入结点
bool InsertRightTreeNode(BiTNode* &T, char x) {
    // 分配空间
    BiTNode *p = (BiTNode*)malloc(sizeof(BiTNode));
    // 分配空间失败的情况
    if(p == NULL) {
        return false;
    }
    // 数据域赋值
    p->data = x;
    // 初始插入,无左右孩子,置空
    p->lchild = NULL;
    p->rchild = NULL;
    // 作为指定插入结点的左孩子
    T->rchild = p;
    return true;
}

// 访问结点
void visit(BiTree T) {
    printf("%c   ", T->data);
}

// 树的深度
int treeDepth(BiTree T) {
    // 根结点为空,则深度为0
    if(T == NULL) {
        return 0;
    } else {
        // 递归遍历左子树,获得左子树深度
        int l = treeDepth(T->lchild);
        // 递归遍历右子树,获得右子树深度
        int r = treeDepth(T->rchild);
        // 树的深度=Max{左子树深度,右子树深度} + 1
        // 加1相当于访问根节点,包括根结点深度+1
        return l > r ? l + 1 : r + 1;
    }
}

// 初始化(带头结点)
void InitQueue(LinkQueue &Q) {
    // 初始时为头结点分配空间,并令头指针、尾指针都指向头结点
    Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
    // 将头结点指针域置空
    Q.front->next = NULL;
}

// 判断队列是否为空
bool IsEmpty(LinkQueue Q) {
    // 头指针与尾指针指向同一地址(头结点即表示队列为空)
    // 或者也可以根据Q.front->next = NULL来进行判定
    if(Q.front == Q.rear) {
        return true;
    } else {
        return false;
    }
}

// 入队
bool EnQueue(LinkQueue &Q, BiTNode *x) {
    // 申请分配空间
    LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
    // 内存分配失败的情况
    if(s == NULL) {
        return false;
    }
    // 将数据赋值给数据域
    s->data = x;
    // 由于队列必定在队尾插入,所以指针域要设为NULL
    s->next = NULL;
    // 入队操作
    Q.rear->next = s;
    // 修改队尾指针
    Q.rear = s;
    return true;
}

// 出队操作
bool DeQueue(LinkQueue &Q, BiTNode* &x) {
    // 空队的情况
    if(Q.front == Q.rear) {
        return false;
    }
    // 由于队列出队操作一定是在队头进行,所以以一临时指针指向队头结点(非头结点,是队列第一个结点)
    LinkNode *p = Q.front->next;
    // 将队头元素赋值给x
    x = p->data;
    // 令队头指针指向队头元素下一个元素
    Q.front->next = p->next;
    // 出队为最后一个结点的情况
    if(Q.rear == p) {
        // 修改尾指针,使其指向头结点,以免之后释放空间时尾指针指向未知地点
        // 同时,也表示此队列已是空队列
        Q.rear = Q.front;
    }
    // 释放空间
    // 由于之后还需要取分支节点的左右孩子,所以不能在此处释放空间
    // free(p);
    return true;
}

// 层序遍历
// 即一层一层从左至右访问每个结点,即广度优先遍历
// 此操作需要一个辅助队列,从根结点开始入队,访问此结点后出队,并将此结点的左右孩子入队(如果有)
// 再对每一个入队结点重复上述操作直至遍历完成(队列空)
void LevelOrder(BiTree T) {
    LinkQueue Q;
    // 初始化辅助队列
    InitQueue(Q);
    BiTree p;
    // 根节点入队
    EnQueue(Q, T);
    // 队列不空则一直循环
    while(!IsEmpty(Q)) {
        // 队头结点出队
        DeQueue(Q, p);
        // 访问出队结点
        visit(p);
        // 访问出队结点
        if(p->lchild != NULL) {
            // 左孩子入队
            EnQueue(Q, p->lchild);
        }
        if(p->rchild != NULL) {
            // 右孩子入队
            EnQueue(Q, p->rchild);
        }
        // 释放空间
        free(p);
    }
}

int main() {
    BiTree T;
    InitTree(T);
    InsertLeftTreeNode(T, 'B');
    InsertRightTreeNode(T, 'C');
    InsertLeftTreeNode(T->lchild, 'D');
    InsertRightTreeNode(T->lchild, 'E');
    InsertLeftTreeNode(T->rchild, 'F');
    InsertRightTreeNode(T->rchild, 'G');
    printf("\ntreeDepth:%d\n", treeDepth(T));
    printf("LevelOrder\n");
    LevelOrder(T);
}

4.运行结果

在这里插入图片描述

【2023王道数据结构】【树与二叉树】二叉树的层序遍历(队列)C、C++完整实现(可直接运行) ~~~笔锋至此又怎能平淡而终,故事开始便不承认普通✌✌✌ ✌ 题目及题解持续更新中 【2023王道数据结构目录】课后算法设计题C、C++代码实现完整版大全 题目: 二叉树的层序遍历(队列)C、C++实现 代码实现: #include <iostream> #include <queue> using namespace std; //创建树结点 typedef struct BiTNode { char data; struct BiTNode *lef. 阅读详情

相关推荐

【2025王道数据结构】王道数据结构课后代码题汇总答案C、C++代码实现完整版大全(可直接运行)

下面内容是本人在复习王道数据结构的过程中, 对一些算法设计题目的全部实现(答案解析全部都是伪码或者函数的部分实现,不可调试运行),不一定是最优的, 但是都能保证端到端测试运行,本文会陆陆续续更新,个人水平有限,可能文章里面存在一些问题,还望各位多多指点。   加油,阿光!!!我看好你哦😋😋😋 以下摘自王道2023年数据结构考研复习指导题目 文章目录 😉第2章:线性表 ✌18页综合应用题 题号 题解链接 1 传送门 2 传送门 3 传送门 4 传送门 5 传送.

优快云 精品推荐 1万+

2020王道数据结构 P126 5 非递归算法求二叉树高

进行层序遍历,设置一last指针,保存当前层的最后元素,一旦队首元素等于这个元素,层数+1,last=队尾元素。 层数+1:因为到了每一层的最后一个元素,该层将结束,自然需要+1 last=队尾元素:层序遍历时,此时的队尾元素正好是下一层的最后一个元素,正好符合last的定义。 代码如下 #include <bits/stdc++.h> #define N 1005 #define...

辣鸡的博客 533

数据结构——十三、二叉树的遍历(王道408)

本文介绍了二叉树的遍历方法,重点讲解了先序、中序和后序遍历的定义及实现。先序遍历顺序为根左右(NLR),中序为左根右(LNR),后序为左右根(LRN)。文章通过图示和表格详细展示了三种遍历的手算步骤,并提供了对应的递归算法代码实现。特别以先序遍历为例,结合函数调用栈图解释了递归遍历二叉树的完整执行过程。这些遍历方法不仅适用于普通二叉树,也可用于分析树等特殊结构,如将算术表达式转化为前缀、中缀和后缀形式。

2301_80201235的博客 900

层序遍历求二叉树(链式存储结构)的高度

int Btdepth(Bitreee T){ if(!T) return 0; //如果是空树,则高度为1; int front =-1,rear=-1; //定义顺序队列,队列元素是二叉树结点指针,用于层序访问链式二叉树; BiTree Q[MaxSize]; ...

qq_37637619的博客 2643

数据结构——十九、树,森林与二叉树之间的转换(王道408)

本文介绍了树、森林与二叉树之间的相互转换方法。重点讲解了孩子兄弟表示法的处理技巧:树转二叉树时,将孩子结点用右指针串联成"糖葫芦"结构;森林转二叉树需将各树根节点视为平级兄弟;恢复时则逆向操作,拆解右指针链。每种转换都配有具体示例和图示说明,最后总结了转换技巧和重要考点。文章采用逐步分解的方式,使复杂的结构转换过程变得清晰易懂,适合学习树形结构转换的读者参考。

2301_80201235的博客 1309

TC275-AutoSAR实战:Davinci Cfg多核OS配置与调试技巧

本文详细介绍了在TC275芯片上使用Davinci Cfg工具进行AutoSAR多核操作系统配置的实战步骤与调试技巧。内容涵盖从导入arxml文件的常见“坑”开始,到配置Det、EcuC、创建多核OS实例、关联OS应用、创建任务与设置优先级调度,最后分享了利用Det日志、调试器多核视图及处理核间通信与缓存一致性等关键调试方法,旨在帮助开发者高效完成复杂车载ECU软件集成。

weixin_29219189的博客 488

二叉树的层序遍历,以及求层数

二叉树的中序遍历,最主要的一种方法是用队列(Queue)来实现,下面贴出一份实现代码 class Tree{ int data; Tree lchild;//左孩子 Tree rchild;//右孩子 } //以下是主要方法 public static void level(Tree root){ if(root!=null){ Queue<Tree> q = new Queue()//初始化一个队列 Tree cur = root;

追梦程序员的博客 4802

TwinCAT报SSE invalid operation错误

错误类型 TwinCAT程序中报出以下错误: 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 **** 383 ms | 'Port_851' (851): Exception (Exception Code: 0xc0000090, SSE invalid operation) in PLC Application Untitled1 Instance, Task PlcTask (RBP: 0xffffb3016c80ecc0, RIP: 0xffffe708ee5b5f53, RSP:

akadiao的博客 4161

王道考研数据结构C语言实现——树前序中序后序层次遍历

王道数据结构教材代码实现(C语言)——树前序中序后序层次遍历 层次遍历使用了链式队列

sht545453896的博客 789

别再只用GPS了!用Android手机传感器实现室内步行轨迹记录(避坑指南)

本文详细介绍了如何利用Android手机传感器(如加速度计、陀螺仪和磁力计)实现室内步行轨迹记录,克服GPS在室内的局限性。通过传感器数据采集、步态检测、航向估计和轨迹绘制等步骤,结合避坑指南和优化技巧,帮助开发者高效构建室内定位应用。

weixin_26821003的博客 274

Gradient Accumulation 梯度累加/梯度累积 (Pytorch)

我们在训练神经网络的时候,batch_size的大小会对最终的模型效果产生很大的影响。一定条件下,batch_size设置的越大,模型就会越稳定。batch_size的值通常设置在 8-32 之间,但是当我们做一些计算量需求大的任务(例如语义分割、GAN等)或者输入图片尺寸太大的时候,我们的batch size往往只能设置为2或者4,否则就会出现 “CUDA OUT OF MEMORY” 的不可抗力报错。 那么如何在有限的计算资源的条件下,训练时采用更大的batch size...

hxxjxw的博客 5809

王道考研数据结构代码总结

目录 不带头结点的单链表 带头结点的单链表 不带头结点的单链表 #include<iostream> #include<algorithm> using namespace std; typedef struct LNode { int data; struct LNode* next; }LNode, * LinkList; //struct LNode* == LinkList //强调节点 用LNode //强调链表 用LinkList //初始化单链

兜率工的博客 3万+

一人公司 CEO × Accio Work:最大能效实战指南

作为一人公司 CEO,你需要同时扮演市场、销售、运营、财务、产品等多个角色。Accio Work 本质上就是你的。

华盛AI的博客 2098

【王道考研】王道数据结构与算法详细笔记(全)

线性表是具有相同数据类型的n(n>0)个数据元素的有限序列。(其中n为表长,当n=0时线性表是一个空表。若用L命名线性表,则其一般表示为)1. 存在惟一的第一个元素。2. 存在惟一的最后一个元素。3. 除第一个元素之外,每个元素均只有一个直接前驱。4. 除最后一个元素之外,每个元素均只有一个直接后继1.是线性表中的“第i个”元素线性表中的位序。2.是表头元素;是表尾元素。

强哥的微博 7万+

AI 智能体(Agent)应用开发工程师 · 进阶面试 (五)

在有多位 Agent 共同参与决策时(如评审委员会、代码审查小组),它们可能提出截然相反的建议。共识机制就是用来在这种冲突中得出唯一行动方案的规则。常用机制:多数投票:每个 Agent 一票,根据投票结果决定。实现简单,但忽略了专业度差异。加权投票:根据 Agent 的角色重要性或历史表现赋予不同权重,例如首席架构师 Agent 的票权重是普通开发者 Agent 的 2 倍。管理者仲裁:由一个权限更高的 Manager Agent 听取各方理由后做出最终裁决。这类似于层级制组织决策。辩论收敛。

篮球界最会写bug的人;程序猿中打球最菜的人。 393

Ceres&OpenCV 单目相机标定(论文复现)

Ceres&OpenCV 单目相机标定(论文复现)

dayuhaitang1的博客 370

【数据结构】【王道】【数据结构实现】文章目录

数据结构实现文章目录

treesorshining的博客 1915

[特殊字符] 2026终极实战:Python爬取得物App球鞋实时交易价格 —— 从签名破解到数据可视化全栈指南

价格敏感度:热门鞋款(如Air Jordan 1、Yeezy 350、Dunk SB)价格每分钟都在波动,短线套利空间巨大。稀缺性:限量发售、联名款、地区限定,导致供需关系实时变化。数据壁垒:得物App使用自研WMS签名算法设备指纹绑定动态请求头加密,是爬虫工程师的“练兵场”。本博客将手把手带你从零搭建一套生产级得物球鞋价格爬虫系统,涵盖:抓包与逆向分析(mitmproxy + Frida)签名算法逆向(Python复刻)设备模拟与心跳保活(ADB + uiautomator2)

2201_76125261的博客 1125

数据结构学习笔记(王道)

数据结构学习笔记(王道) PS:本文章部分内容参考自王道考研数据结构笔记 文章目录数据结构学习笔记(王道)一、绪论1.1. 数据结构1.2. 算法1.2.1. 算法的基本概念1.2.2. 算法的时间复杂度1.2.3. 算法的空间复杂度二、线性表2.1. 线性表的定义和操作2.1.1. 线性表的基本概念2.1.2. 线性表的基本操作2.2. 顺序表2.2.1. 顺序表的基本概念2.2.2. 顺序表的实现2.2.3. 顺序表的基本操作2.3. 链表2.3.1. 单链表的基本概念2.3.2. 单链表的实现2.3.

qq_55593227的博客 4万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【数据结构】| 王道考研——树的前世今生

根据王道视频课总结的数据结构知识点,对于期末考、考研、面试的宝子有帮助哦!!!

狮子也疯狂的博客 1412

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

《数据结构》天勤和王道 第五章 树

《数据结构》天勤和王道 第五章 树王道部分1. 树的基本概念2. 树的常考性质 王道部分 1. 树的基本概念 2. 树的常考性质

壹的博客 4043

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

王道数据结构【二叉树】部分代码实现(C语言)

王道数据结构【二叉树】部分代码实现(C语言)

年少的勇气已经用完,剩下的就是三思而后行 2308

第五章 树与二叉树

本章内容多以选择题或综合题的形式考查,但统考也会出涉及树遍历相关的算法题。树和二叉树的性质、遍历操作、转换、存储结构和操作特性等,满二叉树、完全二叉树、线索二叉树、哈夫曼树的定义和性质,都是选择题必然会涉及的内容。

tridoron6的博客 1754

《王道》数据结构之树和二叉树(五)

数据结构入门之树和二叉树(四) 大纲一、树的定义和基本操作1.1 定义1.1.1 概念1.1.2 特点1.2 基本操作1.2.1 创销、增删改查1.2.2 其他操作二、栈的存储结构和实现2.1 顺序表2.1.1 顺序表的定义及特点2.1.2 顺序表结构的实现(创销)2.1.3 顺序表基本运算的实现(增删改查)2.2 链式表2.2.1 链式表的定义及特点2.2.2 链式表结构的实现(创销)2.2.3 链式表基本运算的实现(增删改查)2.3 顺序表和链式表的比较总结代码附录 大纲 一、树的定义和基本操作

hzy139的博客 1361

【数据结构】第五章:树与二叉树

【数据结构】第五章:树与二叉树 一、树的定义 1. 基本概念 2. 基本术语 3. 常见性质 二、二叉树的定义 1. 基本概念 2. 特殊二叉树 3. 常见性质 三、二叉树的存储结构 1. 顺序存储 2. 链式存储 四、二叉树的遍历 1. 先序遍历 2. 中序遍历 3. 后序遍历 4. 层序遍历 5. 由遍历序列构造二叉树 五、线索二叉树 1. 基本概念 2. 三种线索二叉树 3. 二叉树的线索化 4. 中序线索二叉树找前驱 / 后继 5. 先序线索二叉树找前驱 / 后继 6. 后序线索二叉树找前驱 / 后

iFulling的博客 2024

王道考研数据结构代码总结(第五章)

本文包含王道考研讲课中所涉及的数据结构中的所有代码,当PPT代码和书上代码有所区别时以咸鱼的PPT为主,个人认为PPT上的代码比王道书上的代码要便于理解,此外,本博客也许会补充一些额外的代码进来(不仅受限于王道考研),408中冷门考点频出,应该会囊括所有涉及到的代码,这也是我的DS的第二轮复习,希望与大家共勉之。DS的后四章只有最后一章(排序)涉及大量的代码,而树,图,查找这三章,对于概念的考察比较深入,故本文对于前三章也会进行概念上的整理,代码的话也同样会全部给出。

佛系更新 2350
上一篇: 【数据结构】【王道】【树与二叉树】二叉树的实现及基本操作(可直接运行)
下一篇: 【数据结构】【王道】【树与二叉树】二叉树非递归遍历的实现(可直接运行)
Silver  Star
Silver Star 新星创作者: 大数据技术领域 新星创作者: 大数据技术领域
博客等级 码龄7年 1万+粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Silver Star

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值