树与二叉树---数据结构
树作为一种逻辑结构,同时也是一种分层结构,具有以下两个特点:
1)树的根结点没有前驱,除根结点外的所有结点有 且只有一个前驱。
2)树中所有结点可以有零个或多个后继。
树结点数据结构
满二叉树和完全二叉树
注意
完全二叉树,从左到右依次排,没有缺漏
二叉树的顺序存储
二叉树的层次遍历实战
项目结构
function.h文件
#ifndef LEARN_FUNCTION_H
#define LEARN_FUNCTION_H
#include <stdio.h>
#include <stdlib.h>
typedef char BiElemType;
typedef struct BiNode{BiElemType c;struct BiNode *lchild;struct BiNode *rchild;
}BiNode, *BiTree;
//tag结构体是辅助队列使用的
typedef struct tag{BiTree p;//树的某一个结点的地址值struct tag *pnext;
}tag_t, *ptag_t;
#endif //LEARN_FUNCTION_H
main.cpp文件
calloc
- 申请的空间大小是两个参数直接相乘,并对空间进行初始化,赋值为0,
- 头文件#include <stdlib.h>
#include "function.h"int main(){BiTree pnew;char c;BiTree tree = NULL;ptag_t phead = NULL,ptail = NULL,listpnew = NULL,pcur;while(scanf("%c",&c)){if(c == '\n'){break;//读到换行就结束}//calloc申请的空间大小是两个参数直接相乘,并对空间进行初始化,赋值为0,头文件#include <stdlib.h>pnew = (BiTree)calloc(1, sizeof(BiNode));pnew -> c = c;listpnew = (ptag_t) calloc(1,sizeof(tag_t));//给队列结点申请空间if(NULL == tree){tree = pnew;//tree指向树的根结点phead = listpnew;//第一个结点即是队列头,也是队列尾ptail = listpnew;//pcur = listpnew;//pcur要指向要进入树的父亲元素}else{//让元素先入队列ptail -> pnext = listpnew;ptail = listpnew;//接下来把b结点放入树中if(NULL == pcur -> p -> lchild){pcur -> p -> lchild = pnew;//pcur -> p左孩子为空,就放入左孩子}else if(NULL == pcur -> p -> rchild){pcur -> p -> rchild = pnew;//pcur -> p右孩子为空,就放入右孩子pcur = pcur -> pnext;//当前结点左右孩子都有了,pcur就指向下一个}}}return 0;
}
二叉树的前序中序后序遍历
代码
main.cpp文件
#include "function.h"//前序遍历,也叫先序遍历,也是深度优先遍历
void PreOrder(BiTree p){if(p != NULL){printf("%c",p -> c);PreOrder(p -> lchild);//打印左子树PreOrder(p -> rchild);//打印右子树}
}//中序遍历
void InOrder(BiTree p){if(p != NULL){InOrder(p -> lchild);//打印左子树printf("%c",p -> c);InOrder(p -> rchild);//打印右子树}
}//后序遍历
void PostOrder(BiTree p){if(p != NULL){PostOrder(p -> lchild);//打印左子树v(p -> rchild);//打印右子树printf("%c",p -> c);}
}int main(){BiTree pnew;char c;BiTree tree = NULL;ptag_t phead = NULL,ptail = NULL,listpnew = NULL,pcur;while(scanf("%c",&c)){if(c == '\n'){break;//读到换行就结束}//calloc申请的空间大小是两个参数直接相乘,并对空间进行初始化,赋值为0,头文件#include <stdlib.h>pnew = (BiTree)calloc(1, sizeof(BiNode));pnew -> c = c;listpnew = (ptag_t) calloc(1,sizeof(tag_t));//给队列结点申请空间if(NULL == tree){tree = pnew;//tree指向树的根结点phead = listpnew;//第一个结点即是队列头,也是队列尾ptail = listpnew;//pcur = listpnew;//pcur要指向要进入树的父亲元素}else{//让元素先入队列ptail -> pnext = listpnew;ptail = listpnew;//接下来把b结点放入树中if(NULL == pcur -> p -> lchild){pcur -> p -> lchild = pnew;//pcur -> p左孩子为空,就放入左孩子}else if(NULL == pcur -> p -> rchild){pcur -> p -> rchild = pnew;//pcur -> p右孩子为空,就放入右孩子pcur = pcur -> pnext;//当前结点左右孩子都有了,pcur就指向下一个}}}printf("--------PreOrder--------\n");PreOrder(tree);printf("--------InOrder--------\n");InOrder(tree);printf("--------PostOrder--------\n");PostOrder(tree);return 0;
}
二叉树的层序遍历
注意:
层序遍历,又称广度优先遍历;而层次遍历中的前序遍历又称深度优先遍历。
项目结构
function.h文件
#ifndef LEARN_FUNCTION_H
#define LEARN_FUNCTION_H
#include <stdio.h>
#include <stdlib.h>
typedef char BiElemType;
typedef struct BiNode{BiElemType c;struct BiNode *lchild;struct BiNode *rchild;
}BiNode, *BiTree;//tag结构体是辅助队列使用的
typedef struct tag{BiTree p;//树的某一个结点的地址值struct tag *pnext;
}tag_t, *ptag_t;//队列的结构体
typedef int ElenType;
typedef struct LinkNode{ElemType data;struct LinkNode *next;
}LinkNode;
typedef struct{LinkNode *front,*rear;//链表头,链表尾,也可以称为对头,队尾
}LinkQueue;//先进先出void InitQueue(LinkQueue &Q);
bool IsEmpty(LinkQueue Q);
void EnQueue(LinkNode &Q,ElemType x);
bool DeQueue(LinkNode &Q,E;emType &x);#endif //LEARN_FUNCTION_H
CMakeList.txt文件
里面的内容自动生成
queue.cpp文件
#include "function.h"//初始化队列
void InitQueue(LinkQueue &Q){Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));//头和尾指向同一个结点Q.front -> next = NULL;//头结点的next指针为NULL
}//判断队列是否为空
bool IsEmpty(LinkNode Q){return Q.rear == Q.front;
}//入队
void EnQueue(LinkQueue &Q,ElemType x){LinkNode *pnew = (LinkNode*) malloc(sizeof(LinkNode));pnew -> data = x;pnew -> next =NULL;//要让next为NULL;Q.rear -> next = pnew;//尾指针的next指向pnew,因为从尾部入队Q.rear = pnew;//rear要指向新的尾部
}bool DeQueue(LinkQueue &Q,ElemType &x){if(Q.rear == Q.front){//队列为空return false;}LinkNode* q = Q.front -> next;//拿到第一个结点,存入qx = q -> data;//获取要出对的元素值Q.front -> next = q->next;//让第一个结点断链if(Q.rear == q){//链表只剩余一个结点时,被删除后,要改变rearQ.rear = Q.front;}free(q);return true;
}
main.cpp文件
#include "function.h"//层次遍历,层序遍历,广度优先遍历
void LevelOrder(BiTree T){LinkQueue Q;//辅助队列InitQueue(Q);//初始化队列BiTree p;EnQueue(Q,T);//树根入队while(!IsEmpty(Q)){DeQueue(Q,p);//出队当前结点并打印putchar(p->c);if(p->lchild!=NULL){//入队左孩子EnQueue(Q,p->lchild);}if(p->rchild!=NULL){ //入队右孩子EnQueue(Q,p->rchild);}}
}//层次建树
int main(){BiTree pnew;//用来指向新申请的树结点char c;BiTree tree=NULL;//树根//phead 就是队列头,ptail 就是队列尾ptag_t phead=NULL,ptail=NULL,listpnew=NULL,pcur=NULL;//输入内容为 abcdefghijwhile(scanf("%c",&c)){if(c=='\n'){break;}pnew=(BiTree)calloc(1,sizeof(BiTNode));//calloc 申请空间并对空间进行初始化,赋值为 0pnew->c=c;//数据放进去listpnew=(ptag_t)calloc(1,sizeof(tag_t));//给队列结点申请空间listpnew->p=pnew;if(NULL==tree){tree=pnew;//树的根phead=listpnew;//队列头ptail=listpnew;//队列尾pcur=listpnew;continue;}else{ptail->pnext=listpnew;//新结点放入链表,通过尾插法ptail=listpnew;//ptail 指向队列尾部}//pcur 始终指向要插入的结点的位置if(NULL==pcur->p->lchild)//如何把新结点放入树{pcur->p->lchild=pnew;//把新结点放到要插入结点的左边}else if(NULL==pcur->p->rchild){pcur->p->rchild=pnew;//把新结点放到要插入结点的右边pcur=pcur->pnext;//左右都放了结点后,pcur 指向队列的下一个}}PostOrder(tree);printf("\n--------层次遍历-----------\n");LevelOrder(tree);printf("\n");return 0;
}
相关文章:

树与二叉树---数据结构
树作为一种逻辑结构,同时也是一种分层结构,具有以下两个特点: 1)树的根结点没有前驱,除根结点外的所有结点有 且只有一个前驱。 2)树中所有结点可以有零个或多个后继。 树结点数据结构 满二叉树和完全二…...
C++ .h文件类的调用
demo1只有类的情况下调用 下面写一个util.h 文件里面 // 定义宏防止编译器重复编译 #ifndef TEST_H #define TEST_H class Test{ public:void sum(int a, int b);int num(int a, int b);bool number();}; #endif // TEST_H 调用的时候首先要引入这个头文件 #include "u…...

C语言:分支与循环
创造不易,友友们给个三连吧!! C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实 现这三种结构的,其实我们如果仔细分析,我们⽇常所⻅的事情都可以拆分…...

【linux系统体验】-archlinux折腾日记
archlinux 一、系统安装二、系统配置及美化2.1 中文输入法2.2 安装virtualbox增强工具2.3 终端美化 三、问题总结3.1 终端中文乱码 一、系统安装 安装步骤人们已经总结了很多很全: Arch Linux图文安装教程 大体步骤: 磁盘分区安装 Linux内核配置系统(…...
常用数字处理格式校验
1、前端校验 1.1 要求为数字类型(不限位数与正负) input输入框添加 type“number” <el-input type"number"/>当typenumber时,仍然可以输入字母e或E。解决方法是:给typenumber的输入框添加一个正则表达式&…...

2024.1.26力扣每日一题——边权重均等查询
2024.1.26 题目来源我的题解方法一 使用dfs对每一组查询都求最近公共祖先(会超时,通不过)方法二 不需要构建图,直接在原始数组上进行求最大公共祖先的操作。 题目来源 力扣每日一题;题序:2846 我的题解 …...

C语言操作符超详细总结
文章目录 1. 操作符的分类2. 二进制和进制转换2.1 2进制转10进制2.1.1 10进制转2进制数字 2.2 2进制转8进制和16进制2.2.1 2进制转8进制2.2.2 2进制转16进制 3. 原码、反码、补码4.移位操作符4.1 左移操作符4.2 右移操作符 5. 位操作符:&、|、^、~6. 逗号表达式…...

【Java八股面试系列】JVM-内存区域
目录 Java内存区域 运行时数据区域 线程独享区域 程序计数器 Java 虚拟机栈 StackFlowError&OOM 本地方法栈 线程共享区域 堆 GCR-分代回收算法 字符串常量池 方法区 运行时常量池 HotSpot 虚拟机对象探秘 对象的创建 对象的内存布局 句柄 Java内存区域 运…...

计划任务功能优化,应用商店上架软件超过100款,1Panel开源面板v1.9.6发布
2024年2月7日,现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.9.6版本。 在v1.9.5和v1.9.6这两个小版本中,1Panel针对计划任务等功能进行了多项优化和Bug修复。此外,1Panel应用商店新增了3款应用,上架精选软件应用超过1…...
蓝桥杯(Web大学组)2023省赛真题3:收集帛书碎片
需要实现: 1.将二维数组转为一维数组; 2.数组去重 一、将二维数组转为一维数组: 二、数组去重: function collectPuzzle(...puzzles) {// console.log(puzzles);// console.log(...puzzles);// TODO:在这里写入具体的实现逻辑/…...

使用QT编写一个简单QQ登录界面
widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//设置窗口标题this->setWindowTitle("QQ");//设置窗口图标this->setWindowIcon(…...

TryHackMe-Net Sec Challenge练习
本文相关的TryHackMe实验房间链接:TryHackMe | Why Subscribe nmap nmap -T5 -p- 10.10.90.32 -T5 扫描速度 -p- 全端口扫描 答题: 这题叫我们找藏在http服务下的flag,根据上面扫出来的端口,所以我们开始搞80 这里简单介绍一下…...
面试 JavaScript 框架八股文十问十答第五期
面试 JavaScript 框架八股文十问十答第五期 作者:程序员小白条,个人博客 相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新! ⭐点赞⭐收藏⭐不迷路!⭐ 1)常见的位运算符有…...

[职场] 如何通过运营面试_1 #笔记#媒体#经验分享
如何通过运营面试 盈利是公司的事情,而用户就是你运营的事情。你需要彻底建立一个庞大而有效的用户群,这样才能让你们的公司想盈利就盈利,想战略就战略,想融资就融资。 一般从事运营的人有着强大的自信心,后台数据分析…...

CTFshow web(命令执行 41-44)
web41 <?php /* # -*- coding: utf-8 -*- # Author: 羽 # Date: 2020-09-05 20:31:22 # Last Modified by: h1xa # Last Modified time: 2020-09-05 22:40:07 # email: 1341963450qq.com # link: https://ctf.show */ if(isset($_POST[c])){ $c $_POST[c]; if(!p…...
XML介绍和基本语法
XML简介 XML(eXtensible Markup Language,可扩展标记语言)是一种用于标记电子文件使其具有结构性的标记语言。它允许用户定义自己的标记元素,使得信息的共享和数据的存储更加便捷和通用。XML广泛应用于Web开发、配置文件、数据交…...

Android:Android Studio安装及环境配置
1开发环境搭建 Android开发需要使用java的jdk环境,所以需要下载JAVA JDK。 1.1安装配置JAVA JDK Java的JDK下载: https://www.oracle.com/technetwork/java/javase/downloads/index.html 配置java的环境变量: JAVA_HOME:java安装路径。 新增环境变量CLASSPATH 在Path环境…...

力扣刷题之旅:进阶篇(三)
力扣(LeetCode)是一个在线编程平台,主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目,以及它们的解题代码。 --点击进入刷题地址 一、动态规划(DP) 首先,让我们来…...

代码随想录 Leetcode55. 跳跃游戏
题目: 代码(首刷自解 2024年2月9日): class Solution { public:bool canJump(vector<int>& nums) {int noz 0;for (int i nums.size() - 2; i > 0; --i) {if (nums[i] 0) {noz;continue;} else {if (nums[i] > noz) noz …...
Go Context -- 管理请求的上下文信息
在Go语言中,管理请求的上下文信息对于构建可靠的并发程序至关重要。context 包为我们提供了一种优雅的方式来传递请求的取消信号、超时信息和请求范围的值。接下来将深入探讨Go中的 context 包,包括其基本概念、用法、实际应用场景和最佳实践,…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...