数据结构 day06

news2025/5/13 4:07:48

数据结构 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;
		}
		// 初始化pnew
		pnew->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);
		// 杀死pdel
		pdel->prior->next = pdel->next;
		pdel->next->prior = pdel->prior;
		free(pdel);
		pdel = NULL;
	}
	printf("Survivor is %d", h->data);
	// 释放h
	free(h);
	h = NULL;
}

7. 树 tree

7.1. 特点

7.1.1. 什么是树

  1. 存在一个根节点(root)
  2. 其余节点可以分为若干子树

7.1.2. 树的特性

  1. 层次关系,一对多,
  2. 每个节点最多只有一个前驱,根节点无前驱
  3. 每个节点可以有多个后继,叶节点无后继

7.1.3. 关于树的一些术语

  1. 度数:节点的子树个数,节点有几个孩子
  2. 树度数:整个树中节点最大的度数
  3. 叶节点或终端节点,度数为0的节点,最末端的节点
  4. 分支节点:度数不为0,有孩子的节点
  5. 内部节点:除根节点以外的分支节点
  6. 节点层次:根节点到叶节点之间的个数,称为层数,根节点的层数是1
  7. 树的深度又叫树的高度:最大的节点层次

7.2. 二叉树

7.2.1. 什么是二叉树

每个节点最多只有两个孩子,分为左孩子和右孩子。由一个根节点和两个互不相交的左子树和右子树组成。二叉树严格区分左右孩子,哪怕只有一个孩子也要分左右。

7.2.2. 二叉树的性质

  1. 二叉树第k层上的节点最多有2k-1
  2. 深度为k的二叉树最多有2k-1个节点
  3. 叶节点的数量比度数为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的节点,最下面一层的叶节点都是左孩子,那么就是完全二叉树
非完全二叉树:两种情况:

  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

  1. 当 i > 1 (不为根节点)时,有父节点。父节点编号为i/2;
  2. 当2i <= n时,有左孩子,其编号为2i, 否则没有左孩子,是叶节点
  3. 当 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
  1. 创建二叉树,用递归函数创建。
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);
	else
		p->lchild = NULL;
	if(2*i+1 <= n)
		p->rchild = CreateBitTree(n, 2*i+1);
	else
		p->rchild = NULL;
	
	return p;
}
  1. 正序遍历二叉树,根左右
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);
}
  1. 中序遍历,左根右
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);
}
  1. 后序遍历,左右根
void PostOrder(tree* p)
{
	if(p->lchild !=  NULL)
		PostOrder(p->lchild);
	if(p->rchild != NULL)
		PostOrder(p->rchild);
	printf("%-4d", p->data);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2298429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI编程01-生成前/后端接口对表-豆包(或Deepseek+WPS的AI

前言: 做过全栈的工程师知道,如果一个APP的项目分别是前端/后端两个团队开发的话,那么原型设计之后,通过接口文档进行开发对接是非常必要的。 传统的方法是,大家一起定义一个接口文档,然后,前端和后端的工程师进行为何,现在AI的时代,是不是通过AI能协助呢,显然可以…

01什么是DevOps

在日常开发中&#xff0c;运维人员主要负责跟生产环境打交道&#xff0c;开发和测试&#xff0c;不去操作生产环境的内容&#xff0c;生产环境由运维人员操作&#xff0c;这里面包含了环境的搭建、系统监控、故障的转移&#xff0c;还有软件的维护等内容。 当一个项目开发完毕&…

力扣100. 相同的树(利用分解思想解决)

Problem: 100. 相同的树 文章目录 题目描述思路Code 题目描述 思路 题目要求判断两个二叉树是否完全相同&#xff0c;而此要求可以利用问题分解的思想解决&#xff0c;即判断当前节点的左右子树是否完全相同&#xff0c;而在二叉树问题分解的一般题目中均会带有返回值&#xff…

el-select 设置宽度 没效果

想实现下面的效果&#xff0c;一行两个&#xff0c;充满el-col12 然后设置了 width100%,当时一直没有效果 解决原因&#xff1a; el-form 添加了 inline 所以删除inline属性 即可

chrome://version/

浏览器输入&#xff1a; chrome://version/ Google浏览器版本号以及安装路径 Google Chrome131.0.6778.205 (正式版本) &#xff08;64 位&#xff09; (cohort: Stable) 修订版本81b36b9535e3e3b610a52df3da48cd81362ec860-refs/branch-heads/6778_155{#8}操作系统Windows…

反向代理块sjbe

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

封装一个sqlite3动态库

作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、项目案例 二…

P1878 舞蹈课(详解)c++

题目链接&#xff1a;P1878 舞蹈课 - 洛谷 | 计算机科学教育新生态 1.题目解析 1&#xff1a;我们可以发现任意两个相邻的都是异性&#xff0c;所以他们的舞蹈技术差值我们都要考虑&#xff0c;4和2的差值是2&#xff0c;2和4的差值是2&#xff0c;4和3的差值是1&#xff0c;根…

【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 左值引⽤…

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匿…

九.Spring Boot使用 ShardingSphere + MyBatis + Druid 进行分库分表

文章目录 前言一、引入依赖二、创建一个light-db_1备用数据库三、配置文件 application-dev.yml四、创建shardingsphere-config.yml完整项目结构 五、测试总结 前言 在现代化微服务架构中&#xff0c;随着数据量的不断增长&#xff0c;单一数据库已难以满足高可用性、扩展性和…

【第2章:神经网络基础与实现——2.3 多层感知机(MLP)的构建与调优技巧】

在当今科技飞速发展的时代,人工智能早已不是一个陌生的词汇,它已经渗透到我们生活的方方面面,从智能语音助手到自动驾驶汽车,从图像识别到自然语言处理。而支撑这一切的核心技术之一,就是神经网络。作为机器学习领域的璀璨明星,神经网络已经在众多任务中取得了令人瞩目的…

宠物企业宣传网站静态模板 – 前端静态页面开发实例

该宠物宣传企业站是一个基于前端技术构建的静态网站&#xff0c;旨在为宠物行业的企业提供一个简洁、现代的在线展示平台。整个网站采用HTML、CSS和JavaScript三种技术&#xff0c;确保了良好的用户体验和页面表现。 前端技术&#xff1a; HTML&#xff1a;HTML负责构建网站的…

【第4章:循环神经网络(RNN)与长短时记忆网络(LSTM)——4.2 LSTM的引入与解决长期依赖问题的方法】

在人工智能的璀璨星空中,深度学习模型犹如一颗颗耀眼的星辰,引领着技术的革新。而在处理序列数据的领域中,循环神经网络(RNN)无疑是那颗最为亮眼的星星。然而,即便是这样强大的模型,也面临着一些棘手的问题,其中最突出的便是长期依赖问题。今天,我们就来深入探讨一下长…

el-input输入框样式修改

el-input输入框样式修改 目的&#xff1a;蓝色边框去掉、右下角黑色去掉(可能看不清楚) 之前我试过deep不行 最有效的办法就是就是在底部添加一下css文件 代码中针对input的type为textarea&#xff0c;对于非textarea&#xff0c;只需将下面的css样式中的textarea替换成input…

日常问题-pnpm install执行没有node_modules生成

日常问题-pnpm install执行没有node_modules生成 1.问题2.解决方法 1.问题 执行pnpm i后&#xff0c;提示Scope: all 3 workspace projects Done in 503ms&#xff0c;而且没有node_modules生成。很奇怪 2.解决方法 确保根目录有 pnpm-workspace.yaml 文件&#xff1a; 把这…

C++-----------酒店客房管理系统

酒店客房管理系统 要求&#xff1a; 1.客房信息管理:包括客房的编号、类型、价格、状态等信息的录入和修改; 2.顾客信息管理:包括顾客的基本信息、预订信息等的管理; 3.客房预订:客户可以根据需要进行客房的预订&#xff0c;系统会自动判断客房的可用情况; 4.入住管理:客户入住…

ORDER BY盲注攻击:原理、实现与防御(附Python多线程爆破脚本)

引言 在SQL注入攻击中&#xff0c;ORDER BY注入是一种容易被忽视但危害极大的漏洞类型。与传统的UNION或WHERE注入不同&#xff0c;ORDER BY参数通常无法直接返回查询结果&#xff0c;攻击者需要依赖**盲注&#xff08;Blind SQLi&#xff09;**技术逐字符提取数据。本文将结合…

人工智能在临床应用、药物研发以及患者护理等方面的最新研究进展|顶刊速递·25-02-12

小罗碎碎念 推文速览 第一篇文章提出 CRAFT-MD 框架评估临床大语言模型&#xff08;LLMs&#xff09;在医患互动任务中的表现&#xff0c;发现其存在局限性&#xff0c;并基于结果给出改进评估的建议。 第二篇文章全面阐述了 2019 年以来人工智能在小分子药物研发全流程&#…

【物联网】电子电路基础知识

文章目录 一、基本元器件1. 电阻2. 电容3. 电感4. 二极管(1)符号(2)特性(3)实例分析5. 三极管(1)符号(2)开关特性(3)实例6. MOS管(产效应管)(1)符号(2)MOS管极性判定(3)MOS管作为开关(4)MOS管vs三极管7. 门电路(1)与门(2)或门(3)非门二、常用元器件…