队列和二叉树

        本文主要探讨队列和二叉树的相关知识。

队列

        队列结构:队头指针指向队头元素,队尾指针指向队尾元素(链表形式或数组形式)
        队列特特点:先进先出,对头插入,队尾出队
        双端队列:对头队尾都可插入和出队

二叉树

        二叉树:包含根节点和子节点,一个三角组内只有一个根节点,最多有两个子节点,也可无子节点,子节点和根节点存在某种关系
        二叉树一般用链式存储包含两个子节点指针(左右),根结点指针和父节点指针
        完全二叉树:从根结点起从上往下、从左往右依次存储

demo:

     链式队列

pro.c

#include <stdio.h>
#include <stdlib.h>#include "queue.h"#define QUEUE_LEN 5int main()
{QUEUE *q  = (QUEUE *)malloc(sizeof(QUEUE));int i;init_queue(q,QUEUE_LEN);//测试队列添加for (i = 0;i < 7; i++){push_queue(q,i);printf_queue(q);printf("head : %d, tail : %d,queue size : %d\n",get_head(q),get_tail(q),q->size);}//测试队列删除及删除后再添加for (i = 0;i < 7; i++){pop_queue(q);printf_queue(q);if(q->size)printf("head : %d, tail : %d,queue size : %d\n",get_head(q),get_tail(q),q->size);}for (i = 0;i < 7; i++)push_queue(q,i);printf_queue(q);printf("head : %d, tail : %d,queue size : %d\n",get_head(q),get_tail(q),q->size);//测试队列清空及清空后再添加clean_queue(q);if(q->size)printf("head : %d, tail : %d,queue size : %d\n",get_head(q),get_tail(q),q->size);printf_queue(q);for (i = 0;i < 7; i++)push_queue(q,i);printf_queue(q);printf("head : %d, tail : %d,queue size : %d\n",get_head(q),get_tail(q),q->size);return 0;
}

   queue.h

#include <stdbool.h>typedef struct node
{int data;struct node *next;
} NODE;typedef struct queue
{NODE *head;NODE *tail;int size;int capacity;    //队列容量
} QUEUE;//初始化队列
void init_queue(QUEUE *q,int capacity);//入队
void push_queue(QUEUE *q,int data);//出队
void pop_queue(QUEUE *q);//获取对头
int get_head(QUEUE *q);//获取队尾
int get_tail(QUEUE *q);//判断队满,队满为ture
bool queue_full(QUEUE *q);//判断队空,队空为ture
bool queue_empty(QUEUE *q);//打印队列
void printf_queue(QUEUE *q);//清空队列
void clean_queue(QUEUE *q);

 queue.c

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>#include "queue.h"void init_queue(QUEUE *q,int capacity)
{q->head = q->tail  = (NODE *)malloc(sizeof(NODE));assert(q->head != NULL);q->head->next = NULL;q->size = 0;q->capacity = capacity; return;
}void push_queue(QUEUE *q,int data)
{if(queue_full(q)){printf("queue full\n");return;}NODE *p = (NODE *)malloc(sizeof(NODE));assert(p != NULL);p->data = data;p->next = NULL;q->tail->next = p;q->tail = p;(q->size)++;return;
}void pop_queue(QUEUE *q)
{if(queue_empty(q)){printf("queue empty\n");return;}NODE *p = q->head;q->head = p->next;free(p);(q->size)--;return;
}int get_head(QUEUE *q)
{if(queue_empty(q)){printf("queue empty\n");return;}return q->head->next->data;
}int get_tail(QUEUE *q)
{if(queue_empty(q)){printf("queue empty\n");return;}return q->tail->data;
}bool queue_full(QUEUE *q)
{return (q->size == q->capacity);
}bool queue_empty(QUEUE *q)
{return (q->size == 0);
}void printf_queue(QUEUE *q)
{if(queue_empty(q)){printf("queue empty\n");return;}NODE *p = q->head;p = p->next;while(p != NULL){printf("%d ",p->data);p = p->next;}printf("\n");return;
}void clean_queue(QUEUE *q)
{if(queue_empty(q)){printf("queue empty\n");return;}NODE *p = q->head;NODE *tmp;p = p->next;while(p != NULL){tmp = p;p = p->next;free(tmp);}free(q->head);q->size = 0;return;
}

 结果示例:

        二叉树 

pro.c

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>#include "tree.h"#define TREE_SIZE 50void insert(TREE *t)
{init_tree(t,TREE_SIZE);insert_tree(t,20);insert_tree(t,15);insert_tree(t,30);insert_tree(t,10);insert_tree(t,17);insert_tree(t,1);insert_tree(t,35);insert_tree(t,25);
}int main()
{TREE *t = (TREE *)malloc(sizeof(TREE));assert(t != NULL);insert(t);printf_tree(t->root);printf("\n");NODE *p = NULL;p = find_tree_node(t,1);if(p != NULL)printf("find result: %d\n",p->data);clean_tree(t);printf_tree(t->root);printf("\n");insert(t);printf_tree(t->root);printf("\n");delete_tree_node(t,17);printf_tree(t->root);printf("\n");delete_tree_node(t,10);printf_tree(t->root);printf("\n");delete_tree_node(t,30);printf_tree(t->root);printf("\n");delete_tree_node(t,35);printf_tree(t->root);printf("\n");delete_tree_node(t,20);printf_tree(t->root);printf("\n");return 0;
}

tree.h

#include <stdbool.h>typedef struct node
{int data;struct node *parent;    //父节点struct node *left;      //左子节点struct node *right;     //右子节点
} NODE;typedef struct tree
{NODE *root;             //根节点int size;               //树节点个数int capacity;           //树节点数限制
} TREE;//初始化树
void init_tree(TREE *t,int capacity);//判断树为空
bool tree_emputy(TREE *t);//判断树满
bool tree_full(TREE *t);//获取树节点个数
int get_tree_size(TREE *t);//插入节点
void insert_tree(TREE *t,int data);//遍历树
void printf_tree(NODE *n);//清空树
void clean_tree(TREE *t);//查找树节点
NODE *find_tree_node(TREE *t,int data);//删除树节点
void delete_tree_node(TREE *t,int data);

tree.c

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>#include "tree.h"void init_tree(TREE *t,int capacity)
{t->root = NULL;t->size = 0;t->capacity = capacity;return;
}bool tree_emputy(TREE *t)
{return (t->size == 0);
}bool tree_full(TREE *t)
{return (t->size == t->capacity);
}int get_tree_size(TREE *t)
{return t->size;
}static NODE *create_node(int data)
{NODE *p = malloc(sizeof(NODE));assert(p != NULL);p->data = data;p->left = p->right = p->parent = NULL;return p;
}static NODE *add_left(NODE *n,NODE *p)
{NODE *tmp = n;if(p->data < tmp->data){if(tmp->left == NULL){tmp->left = p;p->parent = tmp;return NULL;}}return tmp->left;
}static NODE *add_right(NODE *n,NODE *p)
{NODE *tmp = n;if(p->data > tmp->data){if(tmp->right == NULL){tmp->right = p;p->parent = tmp;return NULL;}}return tmp->right;
}static void add_tree(TREE *t,NODE *p)
{NODE *tmp = t->root;while(1){if(p->data == tmp->data){printf("%d is excited\n",p->data);return;}else if(p->data > tmp->data){if(!(tmp = add_right(tmp,p)))break;}else{if(!(tmp = add_left(tmp,p)))break;}}t->size++;return;
}void insert_tree(TREE *t,int data)
{TREE *tmp = t;if(tree_full(tmp)){printf("tree full\n");return;}NODE *p = create_node(data);if(tmp->root == NULL){tmp->root = p;tmp->size++;return;}add_tree(tmp,p);return;
}void printf_tree(NODE *n)
{//中序:左根右if(n == NULL)return;printf_tree(n->left);printf("%d ",n->data);printf_tree(n->right);
/*//左序:根左右if(n == NULL)return;printf("%d ",n->data);printf_tree(n->left);printf_tree(n->right);//右序:左右根if(n == NULL)return;printf_tree(n->left);printf_tree(n->right);printf("%d ",n->data);
*/
}static clean_node(NODE *n)
{if(n != NULL){clean_node(n->left);clean_node(n->right);free(n);}
}void clean_tree(TREE *t)
{clean_node(t->root);t->root = NULL;t->size = 0;
}static NODE *find_node(NODE *p,int data)
{while(1){if(p->data == data)return p;if(p->data > data)p = p->left;if(p->data < data)p = p->right;}
}NODE *find_tree_node(TREE *t,int data)
{if(tree_emputy(t)){printf("tree emputy\n");return NULL;}NODE *tmp = NULL;tmp = find_node(t->root,data);return tmp;
}int get_node_size(TREE *t)
{return t->size;
}static delete_leaf(NODE *p)
{if(p->parent->right == p){p->parent->right = NULL;}else{p->parent->left = NULL;}free(p);
}static void delete_single(NODE *p)
{if(p->parent->left == p){if(p->left != NULL){p->parent->left = p->left;p->left->parent = p->parent;}else{p->parent->left = p->right;p->right->parent = p->parent;}}else{if(p->left != NULL){p->parent->right = p->left;p->left->parent = p->parent;}else{p->parent->right = p->right;p->right->parent = p->parent;}}free(p);return;
}static NODE *find_pos(NODE *p)
{while(1){if(p->right != NULL){p = p->right;}else{return p;}}
}static void delete_both(TREE *t,NODE *p)
{NODE *left_pos;left_pos = find_pos(p->left);left_pos->right = p->right;p->right->parent = left_pos;if(p == t->root){t->root = t->root->left;}else{if(p->parent->left == p){p->parent->left = p->left;p->left->parent = p->parent; }else{p->parent->right = p->left;p->left->parent = p->parent;}}free(p);return;
}static void delete_node(TREE *t,NODE *p)
{if(p->right == NULL && p->left == NULL){delete_leaf(p);}else if(p->right != NULL && p->left != NULL){delete_both(t,p);}else{delete_single(p);}
}void delete_tree_node(TREE *t,int data)
{if(tree_emputy(t)){printf("tree emputy\n");return;}NODE *tmp = find_tree_node(t,data);if(!tmp){printf("tree emputy or data is not excited\n");}delete_node(t,tmp);t->size--;return;
}

 结果示例:

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

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

相关文章

CSS基础(CSS导入方式、选择器、属性)

层叠样式表&#xff08;Cascading Style Sheets&#xff0c;缩写为 CSS&#xff09;是一种样式表语言&#xff0c;用来描述 HTML 或 XML&#xff08;包括如 SVG、MathML 或 XHTML 之类的 XML 分支语言&#xff09;文档的呈现方式。CSS 描述了在屏幕、纸质、音频等其他媒体上的元…

《Decoupled Optimisation for Long-Tailed Visual Recognition》阅读笔记

论文标题 《Decoupled Optimisation for Long-Tailed Visual Recognition》 长尾视觉识别的解耦优化 作者 Cong Cong、Shiyu Xuan、Sidong Liu、Shiliang Zhang、Maurice Pagnucco 和 Yang Song、 来自新南威尔士大学计算机科学与工程学院、北京大学计算机学院多媒体信息处…

jenkins+gitlab+sonar自由风格项目配置

新建项目&基本配置 gitlab侧配置 sonar.projectKeytest_sonar sonar.projectNametest_sonar sonar.projectVersion1.0 sonar.sources. sonar.exclusionssrc/layout/** sonar.sourceEncodingUTF-8 sonar.nodejs.executable/app/nodejs/node-v16.20.2-linux-x64/bin/node配置…

pgsql查看指定模式的存储过程

pgsql查看指定模式的存储过程 在 PostgreSQL 中&#xff0c;如果你想要查看指定模式的存储过程&#xff08;也称为函数&#xff09;&#xff0c;你可以使用 \df 或 \df 命令在 psql 命令行工具中&#xff0c;或者使用 SQL 查询来从 pg_catalog 系统模式中查询。 \df命令行查询…

Linux 中 POSIX 互斥信号量(互斥锁)的使用

目录 一、互斥锁的介绍二、使用方法三、测试代码 一、互斥锁的介绍 在Linux系统中&#xff0c;特别是在ARM架构的嵌入式系统中&#xff0c;互斥量&#xff08;Mutex&#xff09;用于保护共享资源不被多个线程或任务同时访问&#xff0c;从而防止数据竞争和不一致性。 POSIX 互斥…

旅游组团奖励标准,申报条件!利川市旅游组团奖励办法

利川市旅游组团奖励有哪些&#xff1f;关于利川市旅游组团奖励标准&#xff0c;申报条件整理如下&#xff1a; 第一条根据《湖北省人民政府办公厅印发关于更好服务市场主体推动经济稳健发展若干政策措施的通知》&#xff08;鄂政办发〔2022〕54号&#xff09;、《恩施州人民政府…

一个完整性能测试流程(非常详细)零基础入门到精通,收藏这一篇就够了

一、性能测试流程规范化的意义 规范化的性能测试流程能帮助测试发现潜在的性能问题和瓶颈&#xff0c;也能确保性能测试的可重复性和可比性。 同时可以帮助确定系统的容量&#xff0c;降低风险及维护成本&#xff0c;提高用户体验和满意度。 二、性能测试流程 一&#xff09…

linux高性能服务器--Ngix内存池简单实现

文章目录 内存模型&#xff1a;流程图内存对齐code 内存模型&#xff1a; 流程图 内存对齐 对齐计算 要分配一个以指定大小对齐的内存&#xff0c;可以使用如下公式&#xff1a; 假设要分配大小为n&#xff0c;对齐方式为x&#xff0c;那么 size(n(x-1)) & (~(x-1))。 举个…

发表博客之:gemm/threadblock/threadblock_swizzle.h 文件夹讲解,cutlass深入讲解

文章目录 [发表博客之&#xff1a;gemm/threadblock/threadblock_swizzle.h 文件夹讲解&#xff0c;cutlass深入讲解](https://cyj666.blog.csdn.net/article/details/138514145)先来看一下最简单的struct GemmIdentityThreadblockSwizzle结构体 发表博客之&#xff1a;gemm/th…

InfiniGate自研网关实现四

13.服务发现组件搭建和注册网关连接 以封装 api-gateway-core 为目的&#xff0c;搭建 SpringBoot Starter 组件&#xff0c;用于服务注册发现的相关内容处理。 这里最大的目的在于搭建起用于封装网关算力服务的 api-gateway-core 系统&#xff0c;提供网关服务注册发现能力。…

【Python技术】使用akshare、pandas高效复盘每日涨停板行业分析

作为一个程序员宝爸&#xff0c;每天的时间很宝贵&#xff0c;工作之余除了辅导孩子作业&#xff0c;就是补充睡眠。 怎么快速高效的进行当天A股涨停板的复盘&#xff0c;便于第二天的跟踪。这里简单写个示例&#xff0c; 获取当天连涨数排序&#xff0c;以及所属行业排序。 …

ICode国际青少年编程竞赛- Python-2级训练场-迷宫

ICode国际青少年编程竞赛- Python-2级训练场-迷宫 1、 Dev.step(3) Dev.turnLeft() for i in range(2):Dev.step(4)Dev.turnRight() for i in range(2):Dev.step(2)Dev.turnLeft() Dev.step(3) Dev.step(-9)2、 Dev.step(3) Dev.turnRight() Dev.step(2) Dev.turnLeft() for i …

TCP及IP协议

TCP协议的传输是可靠的&#xff0c;而UDP协议的传输“尽力而为” TCP传输可靠性———确认&#xff0c;重传&#xff0c;排序&#xff0c;流控。 流控&#xff1a;滑动窗口机制 TTL--- 数据包每经过一个路由器的转发&#xff0c;他的TTL值将减1&#xff0c;当一个数据包中的T…

01-01-11

1、day11作业 使用的代码 #include<stdio.h> #include<stdlib.h> int main() {int i;//申请多大的空间scanf("%d", &i);char* p (char*)malloc(i);//不进行强制类型转换&#xff0c;会产生警告char c;scanf("%c", &c);//清空上面申请…

AutoDL服务器远程桌面

文章目录 1.安装VNC和必要的一些图形显式库:2.SSH隧道2.1.本地安装openssh服务器2.2.服务开启2.3.显示当前安装的 SSH 版本信息2.3.设置一个 SSH 隧道 注意3.VNC Viewer客户端登录4.测试5.参考 VNC&#xff08;Virtual Network Computing &#xff09;是一种图形化的桌面共享协…

python实现背单词程序

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.使用 四.分析 一.前言 背单词是学习英语的一个重要环节,它有很多好处,以下是其中一些主要的好处: 提高词汇量

机器学习各个算法的优缺点!(下篇) 建议收藏。

上篇地址&#xff1a;机器学习各个算法的优缺点&#xff01;&#xff08;上篇&#xff09; 建议收藏。-CSDN博客 直接进入主题。 目录 6.降维算法 7.聚类算法 8.贝叶斯算法 9.人工神经网络 10.深度学习 谢谢观看。 6.降维算法 降维算法是一类用于减少数据维度的技术。 …

C++容器——stack

stack容器 C的std::stack容器是一个基于适配器模板类实现的容器适配器&#xff0c;它提供了一种后进先出的数据结构&#xff0c;即栈。 特点&#xff1a; 1.后进先出&#xff1a;元素在栈容器中按照后进先出的顺序管理&#xff0c;最后放入的元素将会最先被取出。 2.只能从栈…

盲盒一番赏小程序:探索未知,开启神秘宝藏之旅

开启神秘之门&#xff0c;探索未知的乐趣 在繁忙的生活中&#xff0c;我们渴望一丝丝未知带来的惊喜与乐趣。盲盒一番赏小程序&#xff0c;正是为了满足您这种探索未知的欲望而诞生。它不仅仅是一个购物平台&#xff0c;更是一个充满神秘与惊喜的宝藏世界。 精选好物&#xf…

诊所医院超常规运营管理思维课程

本课程旨在引领医疗机构管理者超越传统思维&#xff0c;探索创新运营管理策略。学员将学习领先的医疗管理理念、创新的运营模式&#xff0c;以及如何应对挑战和变革。课程内容涵盖战略规划、资源优化、服务创新等&#xff0c;帮助管理者提升运营效率&#xff0c;提供更优质的医…