数据结构 day06
数据结构 day06
- 6. 双向链表
- 6.3. 双向循环链表
- 7. 树 tree
- 7.1. 特点
- 7.1.1. 什么是树
- 7.1.2. 树的特性
- 7.1.3. 关于树的一些术语
- 7.2. 二叉树
- 7.2.1. 什么是二叉树
- 7.2.2. 二叉树的性质
- 7.2.3. 满二叉树和完全二叉树的区别
- 7.2.4. 二叉树的遍历(画图)
- 7.2.5. 二叉树的顺序存储结构
- 7.2.6. 二叉树的链式存储结构
6. 双向链表
6.3. 双向循环链表
用双向循环链表实现约瑟夫环
#include <stdio.h> #include <stdlib.h> typedef int datatype; // 定义结构体,一个节点的结构体,一个头尾指针的结构体 typedef struct node {datatype data;struct node *prior;struct node *next; }node; typedef struct double_list {struct node *head;struct node *tail; }list; // 主函数 int main() {int i = 0; // 计数int all = 0; // 总人数int start = 0; // 开始报数的人int kill = 0; // 死亡数字node *pdel = NULL; // 用于杀死死者node *h = NULL; // 指向正在报数的人node *pnew = NULL: // 指向新创建的人printf("输入总人数,死亡数字,开始报数的人的编号:");scanf("%d %d %d", &all, &kill, &start);// 创建头尾指针list *p = (list *)malloc(sizeof(list));if(p == NULL){printf("list malloc err\n");return -1;}// 初始化头尾指针p->head = NULL;p->tail = NULL;// 创建节点p->head = (node*)malloc(sizeof(node));if(p->head == NULL){printf("node malloc err\n");free(p);return -1;}p->tail = p->head;// 初始化节点p->head->prior = NULL;p->head->next = NULL;p->head->data = 1;// 循环创建所有的人for(i = 2; i <= all; i++){pnew = (node*)malloc(sizeof(node));if(pnew == NULL){printf("pnewnode malloc err!!\n");return -1;}// 初始化pnewpnew->next = NULL;pnew->prior = NULL;pnew->data = i;// 建立链接pnew->prior = p->tail;p->tail->next = pnew;// 移动尾指针p->tail = p->tail->next;}// 首尾相连p->tail->next = p->head;p->head->prior = p->tail;// h指向开始报数的人h = p->head;while(h->data != start)h = h->next;// 开始报数,报到死亡数字之后杀人while(h != h->next){for(i = 1; i <= kill; i++){h = h->next;}pdel = h;h = h->next;printf("kill %d\n", pdel->data);// 杀死pdelpdel->prior->next = pdel->next;pdel->next->prior = pdel->prior;free(pdel);pdel = NULL;}printf("Survivor is %d", h->data);// 释放hfree(h);h = NULL; }
7. 树 tree
7.1. 特点
7.1.1. 什么是树
- 存在一个根节点(root)
- 其余节点可以分为若干子树
7.1.2. 树的特性
- 层次关系,一对多,
- 每个节点最多只有一个前驱,根节点无前驱
- 每个节点可以有多个后继,叶节点无后继
7.1.3. 关于树的一些术语
- 度数:节点的子树个数,节点有几个孩子
- 树度数:整个树中节点最大的度数
- 叶节点或终端节点,度数为0的节点,最末端的节点
- 分支节点:度数不为0,有孩子的节点
- 内部节点:除根节点以外的分支节点
- 节点层次:根节点到叶节点之间的个数,称为层数,根节点的层数是1
- 树的深度又叫树的高度:最大的节点层次
7.2. 二叉树
7.2.1. 什么是二叉树
每个节点最多只有两个孩子,分为左孩子和右孩子。由一个根节点和两个互不相交的左子树和右子树组成。二叉树严格区分左右孩子,哪怕只有一个孩子也要分左右。
7.2.2. 二叉树的性质
- 二叉树第k层上的节点最多有2k-1个
- 深度为k的二叉树最多有2k-1个节点
- 叶节点的数量比度数为2的节点的数量多1
计算
度数为0:n0
总节点数为各类节点之和:n = n0 + n1 + n2
总节点数为所有子节点数加一:n = 1n1 + 2n2 + 1
0 = n2 + 1 - n0
n0 = n2 + 1
7.2.3. 满二叉树和完全二叉树的区别
满二叉树:深度为k时节点为2k-1
完全二叉树:只有最下面两层有度数小于2的节点,最下面一层的叶节点都是左孩子,那么就是完全二叉树
非完全二叉树:两种情况:
- 除最下面两层外还有别的地方有度数不为2的二叉树
- 只有最下面两层有度数不为2的二叉树,最下面一层存在右孩子
7.2.4. 二叉树的遍历(画图)
前序:根左右,先找根,再找左孩子
中序:左根右,先找左孩子,再找根,再找右孩子
后序:左右根

每个节点左边画圈,沿着最左边划线,沿线顺序就是前序的遍历顺序


练习:
已知遍历结果如下,试画出对应的二叉树。
前序: A B C E H F I J D G K
中序: A H E C I F J B D K G
提示:用前序确定根节点,然后用中序找到根节点然后再找左右子。
7.2.5. 二叉树的顺序存储结构
完全二叉树的节点编号方法为从上到下,从左到右,根节点为1号节点
公式:完全二叉树的节点数为n,某节点编号为i
- 当 i > 1 (不为根节点)时,有父节点。父节点编号为i/2;
- 当2i <= n时,有左孩子,其编号为2i, 否则没有左孩子,是叶节点
- 当 2i <= n 时,有右孩子,其编号为 2i + 1,否则没有右孩子
n个节点可以用n+1个元素的数组顺序存储,节点号和数组下标一一对应,下标为0的位置不用,非完全二叉树虚构节点组成完全二叉树之后存储,会造成空间的浪费
7.2.6. 二叉树的链式存储结构
用链表实现,基于完全二叉树规律创建二叉树,按照完全二叉树的编号方法,从上到下,从左到右
1. 头文件 tree.h
#ifndef __TREE_H__ #define __TREE_H__typedef struct tree_t {int data;int id;tree_t* lchild;tree_t* rchild; }tree;// 1. 创建二叉树 tree* CreateBitTree(int n, int i); // 2. 前序遍历 void PreOrder(tree* p); // 3. 中序遍历 void InOrder(tree* p); // 4. 后序遍历 void PostOrder(tree* p); #endif
- 创建二叉树,用递归函数创建。
tree* p CreateBitTree(int n, int i) //i根节点的编号,n:节点数 {// 申请空间存放根节点tree* p = (tree*)malloc(sizeof(tree));// 容错判断if(p == NULL){printf("BitTree malloc err!!\n");return NULL;}// 初始化p->id = i;p->data = i;if(2*i <= n)p->lchild = CreateBitTree(n, 2*i);elsep->lchild = NULL;if(2*i+1 <= n)p->rchild = CreateBitTree(n, 2*i+1);elsep->rchild = NULL;return p; }
- 正序遍历二叉树,根左右
void PreOrder(tree* p) {if(p == NULL)return;// 根节点输出printf("%-4d", p->data);// 查看左孩子if(p->lchild != NULL)PreOrder(p->lchild);// 查看右孩子if(p->rchild != NULL)PreOrder(p->rchild); }
- 中序遍历,左根右
void InOrder(tree* p) {if(p == NULL)return;if(p->lchild != NULL)InOrder(p->lchild);printf("%-4d", p->data);if(p->rchild != NULL)InOrder(p->rchild); }
- 后序遍历,左右根
void PostOrder(tree* p) {if(p->lchild != NULL)PostOrder(p->lchild);if(p->rchild != NULL)PostOrder(p->rchild);printf("%-4d", p->data); }
相关文章:
数据结构 day06
数据结构 day06 6. 双向链表6.3. 双向循环链表 7. 树 tree7.1. 特点7.1.1. 什么是树7.1.2. 树的特性7.1.3. 关于树的一些术语 7.2. 二叉树7.2.1. 什么是二叉树7.2.2. 二叉树的性质7.2.3. 满二叉树和完全二叉树的区别7.2.4. 二叉树的遍历(画图)7.2.5. 二叉…...
AI编程01-生成前/后端接口对表-豆包(或Deepseek+WPS的AI
前言: 做过全栈的工程师知道,如果一个APP的项目分别是前端/后端两个团队开发的话,那么原型设计之后,通过接口文档进行开发对接是非常必要的。 传统的方法是,大家一起定义一个接口文档,然后,前端和后端的工程师进行为何,现在AI的时代,是不是通过AI能协助呢,显然可以…...
01什么是DevOps
在日常开发中,运维人员主要负责跟生产环境打交道,开发和测试,不去操作生产环境的内容,生产环境由运维人员操作,这里面包含了环境的搭建、系统监控、故障的转移,还有软件的维护等内容。 当一个项目开发完毕&…...
力扣100. 相同的树(利用分解思想解决)
Problem: 100. 相同的树 文章目录 题目描述思路Code 题目描述 思路 题目要求判断两个二叉树是否完全相同,而此要求可以利用问题分解的思想解决,即判断当前节点的左右子树是否完全相同,而在二叉树问题分解的一般题目中均会带有返回值ÿ…...
【深度学习模型分类】
深度学习模型种类繁多,涵盖了从基础到前沿的多种架构。以下是主要模型的分类及代表性方法: 1. 基础模型 1.1 多层感知机(MLP) 特点:全连接神经网络,适用于结构化数据。 应用:分类、回归任务…...
el-select 设置宽度 没效果
想实现下面的效果,一行两个,充满el-col12 然后设置了 width100%,当时一直没有效果 解决原因: el-form 添加了 inline 所以删除inline属性 即可...
chrome://version/
浏览器输入: chrome://version/ Google浏览器版本号以及安装路径 Google Chrome131.0.6778.205 (正式版本) (64 位) (cohort: Stable) 修订版本81b36b9535e3e3b610a52df3da48cd81362ec860-refs/branch-heads/6778_155{#8}操作系统Windows…...
反向代理块sjbe
1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说,反向代理就相当于…...
封装一个sqlite3动态库
作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、项目案例 二…...
P1878 舞蹈课(详解)c++
题目链接:P1878 舞蹈课 - 洛谷 | 计算机科学教育新生态 1.题目解析 1:我们可以发现任意两个相邻的都是异性,所以他们的舞蹈技术差值我们都要考虑,4和2的差值是2,2和4的差值是2,4和3的差值是1,根…...
力扣第一题 哈希解法 O(n)时间复杂度
题目: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那俩个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返…...
【C++学习篇】C++11
目录 编辑 1. 初始化列表{} 1.1 C98中的{} 1.2 C11中的{} 2. C11中的std::initializer_list 3. 右值引用和移动语义 3.1 左值和右值 3.2 左值引用和右值引用 3.3 引用延长生命周期 3.4 左值和右值的参数匹配 3.5 右值引⽤和移动语义的使⽤场景 3.5.1 左值引⽤…...
leetcode刷题第十天——栈与队列Ⅱ
本次刷题顺序是按照卡尔的代码随想录中给出的顺序 1047. 删除字符串中的所有相邻重复项 char* removeDuplicates(char* s) {int len strlen(s);char* tmp malloc(sizeof(char) * (len 1));int top -1, idx 0;while(idx < len) {if(top -1) tmp[top] s[idx];else {i…...
Vulnhub靶机随笔-Hackable II
Vulnhub靶机Hackable II详解 攻击机Kali IP:192.168.1.6 靶机 IP:未知 系统:未知 A.信息收集 扫描靶机存活性 确定IP地址 1.命令:arp-scan -l 扫描靶机开放端口及其服务版本信息 2.命令:nmap -A -p- -sV 靶机IP 3.靶机开放三个端口: 21ftp端口:存在anonymous匿…...
适配器模式 + 外观模式联合使用:新旧系统的平滑整合之道
🌟 引言:当系统演进遇到历史包袱 场景痛点: 假设企业需要将老旧的CRM系统与新的SaaS平台整合,面临: 旧系统接口:XML格式+同步调用新系统接口:JSON格式+异步调用需要统一提供简洁的RESTful API给前端若直接修改旧系统: // 旧系统核心类(无法修改) public class Leg…...
九.Spring Boot使用 ShardingSphere + MyBatis + Druid 进行分库分表
文章目录 前言一、引入依赖二、创建一个light-db_1备用数据库三、配置文件 application-dev.yml四、创建shardingsphere-config.yml完整项目结构 五、测试总结 前言 在现代化微服务架构中,随着数据量的不断增长,单一数据库已难以满足高可用性、扩展性和…...
【第2章:神经网络基础与实现——2.3 多层感知机(MLP)的构建与调优技巧】
在当今科技飞速发展的时代,人工智能早已不是一个陌生的词汇,它已经渗透到我们生活的方方面面,从智能语音助手到自动驾驶汽车,从图像识别到自然语言处理。而支撑这一切的核心技术之一,就是神经网络。作为机器学习领域的璀璨明星,神经网络已经在众多任务中取得了令人瞩目的…...
宠物企业宣传网站静态模板 – 前端静态页面开发实例
该宠物宣传企业站是一个基于前端技术构建的静态网站,旨在为宠物行业的企业提供一个简洁、现代的在线展示平台。整个网站采用HTML、CSS和JavaScript三种技术,确保了良好的用户体验和页面表现。 前端技术: HTML:HTML负责构建网站的…...
git如何下载指定版本
要使用Git下载指定版本,可以通过以下步骤进行操作: 1. 使用Git命令行下载指定版本: 1.1 首先,使用git clone命令克隆整个git库到本地。例如:git clone [库的URL]。这将下载最新的代码到本地。 1.2 进入克隆…...
【第4章:循环神经网络(RNN)与长短时记忆网络(LSTM)——4.2 LSTM的引入与解决长期依赖问题的方法】
在人工智能的璀璨星空中,深度学习模型犹如一颗颗耀眼的星辰,引领着技术的革新。而在处理序列数据的领域中,循环神经网络(RNN)无疑是那颗最为亮眼的星星。然而,即便是这样强大的模型,也面临着一些棘手的问题,其中最突出的便是长期依赖问题。今天,我们就来深入探讨一下长…...
IoTDB 集群节点 IP 改变,如何更新集群
问题 问题1:如果 IoTDB 配置的时候用的 IP,没有用 hostname,后面 IP 修改了,历史数据需要重新导吗? 问题2:如果现场运行 IoTDB 半年,电脑 IP 要改的话,半年的数据要导出来再导入么…...
C++ 设计模式-建造者模式
以下是一个完整的C建造者模式示例,包含产品类、建造者接口、具体建造者、指挥者以及测试代码: #include <iostream> #include <string> #include <memory>// 产品类:汽车 class Car { public:void setBody(const std::str…...
词袋模型和词嵌入模型区别和关联分析(词袋模型是否属于词嵌入模型)
词袋模型(Bag of Words, BoW)不属于词嵌入模型,它们是两种完全不同的文本表示方法。以下从多个维度对比二者的核心区别 1. 本质区别 特性词袋模型 (BoW)词嵌入模型 (Word Embedding)表示形式离散的稀疏向量(高维,维度…...
png、jpg、gif、webp的区别
png、jpg、gif、webp的区别 1.img的格式2.问题 1.img的格式 png 无损压缩,尺寸体积比jpg/jpeg大;适合做小图标jpg 采用了压缩算法,有一点失真,比png体积小;适合中大型图片gif 动态图webp 同时支持有损和无损压缩,相同质量的图片,webp具有更小的体积,但兼容性不太好(在某些浏览…...
el-input输入框样式修改
el-input输入框样式修改 目的:蓝色边框去掉、右下角黑色去掉(可能看不清楚) 之前我试过deep不行 最有效的办法就是就是在底部添加一下css文件 代码中针对input的type为textarea,对于非textarea,只需将下面的css样式中的textarea替换成input…...
什么是多光谱环形光源
多光谱环形光源是一种用于机器视觉、工业检测和科学研究的光源设备,能够提供多种波长的光,适用于不同材料和表面的检测需求。以下是其关键特点和应用: 关键特点 多光谱输出:可发射多种波长的光(如可见光、红外光、紫外…...
几款C#开发的入门书籍与视频教程
以下是几本适合C#初学者的书籍和一些优质的视频教程推荐,帮助你快速入门C#开发: 书籍推荐 1. 《C#入门经典》 • 作者:Karli Watson, Christian Nagel 等 • 特点:经典的C#入门书籍,内容全面,从基础语法到…...
日常问题-pnpm install执行没有node_modules生成
日常问题-pnpm install执行没有node_modules生成 1.问题2.解决方法 1.问题 执行pnpm i后,提示Scope: all 3 workspace projects Done in 503ms,而且没有node_modules生成。很奇怪 2.解决方法 确保根目录有 pnpm-workspace.yaml 文件: 把这…...
2025蓝桥杯JAVA编程题练习Day4
1.艺术与篮球 问题描述 小蓝出生在一个艺术与运动并重的家庭中。 妈妈是位书法家,她希望小蓝能通过练习书法,继承她的艺术天赋,并练就一手好字。爸爸是一名篮球教练,他希望小蓝能通过篮球锻炼身体,培养运动的激情和…...
C++-----------酒店客房管理系统
酒店客房管理系统 要求: 1.客房信息管理:包括客房的编号、类型、价格、状态等信息的录入和修改; 2.顾客信息管理:包括顾客的基本信息、预订信息等的管理; 3.客房预订:客户可以根据需要进行客房的预订,系统会自动判断客房的可用情况; 4.入住管理:客户入住…...
