当前位置: 首页 > news >正文

树与二叉树---数据结构

 树作为一种逻辑结构,同时也是一种分层结构,具有以下两个特点:

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;
}

相关文章:

树与二叉树---数据结构

树作为一种逻辑结构&#xff0c;同时也是一种分层结构&#xff0c;具有以下两个特点&#xff1a; 1&#xff09;树的根结点没有前驱&#xff0c;除根结点外的所有结点有 且只有一个前驱。 2&#xff09;树中所有结点可以有零个或多个后继。 树结点数据结构 满二叉树和完全二…...

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语言:分支与循环

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

【linux系统体验】-archlinux折腾日记

archlinux 一、系统安装二、系统配置及美化2.1 中文输入法2.2 安装virtualbox增强工具2.3 终端美化 三、问题总结3.1 终端中文乱码 一、系统安装 安装步骤人们已经总结了很多很全: Arch Linux图文安装教程 大体步骤&#xff1a; 磁盘分区安装 Linux内核配置系统&#xff08;…...

常用数字处理格式校验

1、前端校验 1.1 要求为数字类型&#xff08;不限位数与正负&#xff09; input输入框添加 type“number” <el-input type"number"/>当typenumber时&#xff0c;仍然可以输入字母e或E。解决方法是&#xff1a;给typenumber的输入框添加一个正则表达式&…...

2024.1.26力扣每日一题——边权重均等查询

2024.1.26 题目来源我的题解方法一 使用dfs对每一组查询都求最近公共祖先&#xff08;会超时&#xff0c;通不过&#xff09;方法二 不需要构建图&#xff0c;直接在原始数组上进行求最大公共祖先的操作。 题目来源 力扣每日一题&#xff1b;题序&#xff1a;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. 位操作符&#xff1a;&、|、^、~6. 逗号表达式…...

【Java八股面试系列】JVM-内存区域

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

计划任务功能优化,应用商店上架软件超过100款,1Panel开源面板v1.9.6发布

2024年2月7日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.9.6版本。 在v1.9.5和v1.9.6这两个小版本中&#xff0c;1Panel针对计划任务等功能进行了多项优化和Bug修复。此外&#xff0c;1Panel应用商店新增了3款应用&#xff0c;上架精选软件应用超过1…...

蓝桥杯(Web大学组)2023省赛真题3:收集帛书碎片

需要实现&#xff1a; 1.将二维数组转为一维数组&#xff1b; 2.数组去重 一、将二维数组转为一维数组&#xff1a; 二、数组去重&#xff1a; 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实验房间链接&#xff1a;TryHackMe | Why Subscribe nmap nmap -T5 -p- 10.10.90.32 -T5 扫描速度 -p- 全端口扫描 答题&#xff1a; 这题叫我们找藏在http服务下的flag&#xff0c;根据上面扫出来的端口&#xff0c;所以我们开始搞80 这里简单介绍一下…...

面试 JavaScript 框架八股文十问十答第五期

面试 JavaScript 框架八股文十问十答第五期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;常见的位运算符有…...

[职场] 如何通过运营面试_1 #笔记#媒体#经验分享

如何通过运营面试 盈利是公司的事情&#xff0c;而用户就是你运营的事情。你需要彻底建立一个庞大而有效的用户群&#xff0c;这样才能让你们的公司想盈利就盈利&#xff0c;想战略就战略&#xff0c;想融资就融资。 一般从事运营的人有着强大的自信心&#xff0c;后台数据分析…...

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&#xff08;eXtensible Markup Language&#xff0c;可扩展标记语言&#xff09;是一种用于标记电子文件使其具有结构性的标记语言。它允许用户定义自己的标记元素&#xff0c;使得信息的共享和数据的存储更加便捷和通用。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环境…...

力扣刷题之旅:进阶篇(三)

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

代码随想录 Leetcode55. 跳跃游戏

题目&#xff1a; 代码(首刷自解 2024年2月9日&#xff09;&#xff1a; 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语言中&#xff0c;管理请求的上下文信息对于构建可靠的并发程序至关重要。context 包为我们提供了一种优雅的方式来传递请求的取消信号、超时信息和请求范围的值。接下来将深入探讨Go中的 context 包&#xff0c;包括其基本概念、用法、实际应用场景和最佳实践&#xff0c…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;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 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

2021-03-15 iview一些问题

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

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...