树与二叉树---数据结构
树作为一种逻辑结构,同时也是一种分层结构,具有以下两个特点:
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 包,包括其基本概念、用法、实际应用场景和最佳实践,…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
