二叉树(多路平衡搜索树)-(代码、分析、汇编)

目录:

    • 代码:
    • 分析:
    • 汇编:

代码:

BTree.h

#ifndef _BTREE_H_
#define _BTREE_H_#define BT_LEFT 0 //定义左子节点标识
#define BT_RIGHT 1 //定义右子节点标识typedef void BTree;//定义树类型
typedef unsigned long long BTPos;//定义树位置类型typedef struct _tag_BTreeNode BTreeNode;//定义树节点类型
struct _tag_BTreeNode
{BTreeNode* left;BTreeNode* right;
};typedef void (BTree_Printf)(BTreeNode*);//定义树节点类型指针参数无返回值的函数类型BTree* BTree_Create();//声明创建树函数void BTree_Destroy(BTree* tree);//声明销毁树函数void BTree_Clear(BTree* tree);//声明清空树函数int BTree_Insert(BTree* tree, BTreeNode* node, BTPos pos, int count, int flag);//声明插入节点函数BTreeNode* BTree_Delete(BTree* tree, BTPos pos, int count);//声明删除节点函数BTreeNode* BTree_Get(BTree* tree, BTPos pos, int count);//声明获取节点函数BTreeNode* BTree_Root(BTree* tree);//声明获取根节点函数int BTree_Height(BTree* tree);//声明获取树高度函数int BTree_Count(BTree* tree);//声明获取树节点数量函数int BTree_Degree(BTree* tree);//声明获取树度数函数void BTree_Display(BTree* tree, BTree_Printf* pFunc, int gap, char div);//声明用函数处理每个节点的函数#endif

BTree.c

#include <stdio.h>
#include <malloc.h>
#include "BTree.h"typedef struct _tag_BTree TBTree;//定义实际使用树类型
struct _tag_BTree
{int count;//节点数量BTreeNode* root;//根节点
};static void recursive_display(BTreeNode* node, BTree_Printf* pFunc, int format, int gap, char div) // 定义递归处理节点函数
{int i = 0;if( (node != NULL) && (pFunc != NULL) )//如果节点与函数指针不为空{for(i=0; i<format; i++)//输出占位符{printf("%c", div);}pFunc(node);//对节点进行函数处理printf("\n");if( (node->left != NULL) || (node->right != NULL) )//如果左子节点或右子节点不为空{recursive_display(node->left, pFunc, format + gap, gap, div);//处理左子节点,占位符数量以gap递增recursive_display(node->right, pFunc, format + gap, gap, div);//处理右子节点,占位符数量以gap递增}}else//如果节点或函数指针为空 只输出占位符{for(i=0; i<format; i++)//输出占位符{printf("%c", div);}printf("\n");}
}static int recursive_count(BTreeNode* root) // 递归调用计算以一个节点开始下面所有子节点数量(包括第一次的节点本身)函数
{int ret = 0;if( root != NULL ){//递归调用每次调用只要不是空节点都会加1 数量ret = recursive_count(root->left) + 1 + recursive_count(root->right);}return ret;
}static int recursive_height(BTreeNode* root) // 定义递归计算树高度的函数
{int ret = 0;if( root != NULL ){int lh = recursive_height(root->left);int rh = recursive_height(root->right);ret = ((lh > rh) ? lh : rh) + 1;//取左右两边节点较多的再加上本身节点}return ret;//返回高度
}static int recursive_degree(BTreeNode* root) //定义递归计算度数函数
{  //最大度数只会是2int ret = 0;if( root != NULL ){if( root->left != NULL ){ret++;}if( root->right != NULL ){ret++;}//如果是根节点是1,表示还不是最大度数,继续往子节点寻找有没有最大度数存在if( ret == 1 ){int ld = recursive_degree(root->left);int rd = recursive_degree(root->right);if( ret < ld )//如果该节点的左子节点中有度数比该节点大{ret = ld;//取左子节点返回的度数}if( ret < rd )//如果右子节点中有度数比现在度数{ret = rd;//取右子节点返回的度数}}}return ret;//返回最终度数 
}BTree* BTree_Create()//定义创建树函数
{TBTree* ret = (TBTree*)malloc(sizeof(TBTree));//申请使用的树空间if( ret != NULL )//申请成功{ret->count = 0;//数量为0ret->root = NULL;//根节点为空}return ret;//返回创建树
}void BTree_Destroy(BTree* tree) // 定义销毁树函数
{free(tree);
}void BTree_Clear(BTree* tree) // 定义清空树函数
{TBTree* btree = (TBTree*)tree;if( btree != NULL ){btree->count = 0;btree->root = NULL;}
}
/* count 表示插入节点的上面有多少层节点flag 表示原来该位置的节点位于插入节点的方向
*/
int BTree_Insert(BTree* tree, BTreeNode* node, BTPos pos, int count, int flag) // 定义插入节点函数
{TBTree* btree = (TBTree*)tree;//转换成使用树类型//判断树与插入节点不为空,和flag标识是左边或右边int ret = (btree != NULL) && (node != NULL) && ((flag == BT_LEFT) || (flag == BT_RIGHT));int bit = 0;if( ret ){BTreeNode* parent = NULL;BTreeNode* current = btree->root;node->left = NULL;//将插入节点的左子节点设空node->right = NULL;//将插入节点的右子节点设空while( (count > 0) && (current != NULL) )//找到插入的位置{bit = pos & 1;//判断pos是奇数还是偶数 (奇数往右偶数往左)pos = pos >> 1;parent = current;//父节点赋值if( bit == BT_LEFT )//如果是左边{current = current->left;//取得节点左子节点指向}else if( bit == BT_RIGHT )//如果是右边{current = current->right;//取得节点右子节点指向}count--;}if( flag == BT_LEFT )//如插入位置是左子节点{node->left = current;//将本来在该位置的节点设为新插入节点的左子节点}else if( flag == BT_RIGHT )//如果插入位置是右子节点{node->right = current;//将本来在该位置的节点设为新插入节点的右子节点}if( parent != NULL )//如果父节点不为空{if( bit == BT_LEFT ){parent->left = node;//父节点的左子节点指向新插入节点 }else if( bit == BT_RIGHT ){parent->right = node;//父节点的右子节点指向新插入节点}}else//父节点为表示是{btree->root = node;//将新插入节点当作根节点}btree->count++;//树节点数量增加}return ret;
}BTreeNode* BTree_Delete(BTree* tree, BTPos pos, int count) // 定义删除节点函数
{/*注意:删除节点后面,删除的节点与其子节点都不在树中,而且删除的节点和其子节点的left和right 没置空,还保持着对应关系 */TBTree* btree = (TBTree*)tree;//取得树BTreeNode* ret = NULL; int bit = 0;if( btree != NULL )//树不为空{BTreeNode* parent = NULL;BTreeNode* current = btree->root;//取得根节点while( (count > 0) && (current != NULL) )//取得删除节点{bit = pos & 1;pos = pos >> 1;parent = current;if( bit == BT_LEFT ){current = current->left;}else if( bit == BT_RIGHT ){current = current->right;}count--;}if( parent != NULL )//如果父节点不为空{if( bit == BT_LEFT )//如果删除节点是父节点的左边{parent->left = NULL;//将父节点的左子节点置空不指向删除节点了}else if( bit == BT_RIGHT )//如果删除节点是父节点的右边{parent->right = NULL;//将父节点的右子节点置空不指向删除节点了}}else//如果父节点为空{btree->root = NULL;//直接将根节点置空}ret = current;//取得删除节点//调用递归计算以删除节点开始和其子节点数量,再总数减少得删除该节点后树的节点数btree->count = btree->count - recursive_count(ret);}return ret;//返回删除节点
}BTreeNode* BTree_Get(BTree* tree, BTPos pos, int count) // 定义获取节点函数
{TBTree* btree = (TBTree*)tree;//取得树BTreeNode* ret = NULL; int bit = 0;if( btree != NULL )//树不为空{BTreeNode* current = btree->root;//取得根节点while( (count > 0) && (current != NULL) )//找到要获取的节点{bit = pos & 1;pos = pos >> 1;if( bit == BT_LEFT ){current = current->left;}else if( bit == BT_RIGHT ){current = current->right;}count--;}ret = current;//取得获取节点}return ret;//返回获取节点
}BTreeNode* BTree_Root(BTree* tree) // 定义获取根节点函数
{TBTree* btree = (TBTree*)tree;//取得树BTreeNode* ret = NULL;if( btree != NULL )//如果树不为空{ret = btree->root;//取得根节点}return ret;//获取根节点
}int BTree_Height(BTree* tree) // 定义获取树高度函数
{TBTree* btree = (TBTree*)tree;int ret = 0;if( btree != NULL )//如果查{ret = recursive_height(btree->root);//用根节点调用递归计算高度函数计算高度}return ret;//返回高度
}int BTree_Count(BTree* tree) // 定义获取节点数量函数
{TBTree* btree = (TBTree*)tree;//取得树int ret = 0;if( btree != NULL ){ret = btree->count;//取得树节点数量}return ret;//返回数量
}int BTree_Degree(BTree* tree) // 定义获取树度数函数
{TBTree* btree = (TBTree*)tree;//取得树int ret = 0;if( btree != NULL ){ret = recursive_degree(btree->root);//用根节点调用递归计算度数函数}return ret;//返回度数 
}void BTree_Display(BTree* tree, BTree_Printf* pFunc, int gap, char div) //定义使用函数统一处理节点信息函数
{TBTree* btree = (TBTree*)tree;//取得树if( btree != NULL ){recursive_display(btree->root, pFunc, 0, gap, div);//调用递归处理函数}
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include "BTree.h"struct Node
{BTreeNode header;char v;
};void printf_data(BTreeNode* node)
{if( node != NULL ){printf("%c", ((struct Node*)node)->v);}
}int main(int argc, char *argv[])
{BTree* tree = BTree_Create();struct Node n1 = {{NULL, NULL}, 'A'};struct Node n2 = {{NULL, NULL}, 'B'};struct Node n3 = {{NULL, NULL}, 'C'};struct Node n4 = {{NULL, NULL}, 'D'};struct Node n5 = {{NULL, NULL}, 'E'};struct Node n6 = {{NULL, NULL}, 'F'};BTree_Insert(tree, (BTreeNode*)&n1, 0, 0, 0);BTree_Insert(tree, (BTreeNode*)&n2, 0x00, 1, 0);BTree_Insert(tree, (BTreeNode*)&n3, 0x01, 1, 0);BTree_Insert(tree, (BTreeNode*)&n4, 0x00, 2, 0);BTree_Insert(tree, (BTreeNode*)&n5, 0x02, 2, 0);BTree_Insert(tree, (BTreeNode*)&n6, 0x02, 3, 0);printf("Height: %d\n", BTree_Height(tree));printf("Degree: %d\n", BTree_Degree(tree));printf("Count: %d\n", BTree_Count(tree));printf("Position At (0x02, 2): %c\n", ((struct Node*)BTree_Get(tree, 0x02, 2))->v);printf("Full Tree: \n");BTree_Display(tree, printf_data, 4, '-');BTree_Delete(tree, 0x00, 1);printf("After Delete B: \n");printf("Height: %d\n", BTree_Height(tree));printf("Degree: %d\n", BTree_Degree(tree));printf("Count: %d\n", BTree_Count(tree));printf("Full Tree: \n");BTree_Display(tree, printf_data, 4, '-');BTree_Clear(tree);printf("After Clear: \n");printf("Height: %d\n", BTree_Height(tree));printf("Degree: %d\n", BTree_Degree(tree));printf("Count: %d\n", BTree_Count(tree));BTree_Display(tree, printf_data, 4, '-');BTree_Destroy(tree);getchar();return 0;
}

分析:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

汇编:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Python---二分法查找

输入n个数&#xff0c;通过二分法查找该数的下标 def binarySearch(arr,value):m 0#开始n len(arr#最后)while m<n:mid(mn)//2#计算中间位置if valuearr[mid]:#查找成功&#xff0c;返回元素对应的位置return midelif value>arr[mid]:#在后面一半元素中继续查找mmid1e…

SQL捕获异常

原文地址 http://technet.microsoft.com/zh-cn/office/ms179296%28vsql.100%29在 Transact-SQL 中使用 TRY...CATCHTransact-SQL 代码中的错误可使用 TRY…CATCH 构造处理&#xff0c;此功能类似于 Microsoft Visual C 和 Microsoft Visual C# 语言的异常处理功能。TRY…CATCH …

二叉树遍历(代码,分析,汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; BTree.h BTree.c 二叉树&#xff08;多路平衡搜索树&#xff09; LinkQueue.h #ifndef _LINKQUEUE_H_ #define _LINKQUEUE_H_typedef void LinkQueue;//定义队列类型LinkQueue* LinkQueu…

Python---查找序列的最长递增子序列

查找序列的最长递增子序列 什么是序列的最长递增子序列&#xff1f; 答&#xff1a;在一个数值序列中&#xff0c;找到一个子序列&#xff0c;使得这个子序列元素的数值依次递增&#xff0c;并且这个子序列的长度尽可能地大。这就是所谓的最长递增子序列 from itertools impo…

ffmpeg-从mp4、flv、ts文件中提取264视频流数据

ffmpeg-从mp4、flv、ts文件中提取264视频流数据 main.c #include <stdio.h> #include <libavutil/log.h> #include <libavformat/avio.h> #include <libavformat/avformat.h>void proc(int need_to_annexb, char* in_file, char* out_file) {AVForma…

线索化二叉树(代码 、分析 、汇编)

目录&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;代码&#xff1a; BTree.h BTree.c 二叉树&#xff08;多路平衡搜索树&#xff09; SeqList.h SeqList.c 顺序表 main.c #include <stdio.h> #include <stdlib.h> #include "BTree.h&qu…

Python---寻找给定序列中相差最小的两个数字

编写函数&#xff0c;寻找给定序列中相差最小的两个数字 def getTwoClosestElements(arr):#先进行排序&#xff0c;使得相邻元素最接近#相差最小的元素必然相邻seq sorted(arr)#先进行排序dif float(inf)#无穷大#遍历所有元素&#xff0c;两两比较&#xff0c;比较相邻元素的…

Python---利用蒙特.卡罗方法计算圆周率近似值

利用蒙特.卡罗方法计算圆周率近似值 什么是蒙特.卡罗方法&#xff1f; 答&#xff1a;蒙特卡罗方法是一种计算方法。原理是通过大量随机样本&#xff0c;去了解一个系统&#xff0c;进而得到所要计算的值。 正方形内部有一个相切的圆&#xff0c;它们的面积之比是π/4。 这里假…

FLV封装格式的分析

FLV封装格式的分析&#xff0c;各种详细的参数比较多没有详细解释&#xff0c;这是总体的格式分布。详细的参数说明可以参照文档。 以flv格式内封装的音频流是aac、视频流是h264分析&#xff1a; flv文件tag部分截图&#xff1a;可以看到音频TAG、视频TAG是交错存储的

《计算机基础复习》===数据库技术基础

数据库系统三级结构&#xff1a; 数据库系统一般划分为三个抽象级&#xff1a;用户级、概念级、物理级。 1&#xff09;用户级数据库&#xff1a;对应于外模式。它是用户看到和使用的数据库&#xff0c;又称用户视图&#xff1b;用户级数据库主要由外部记录组成&#xff0c;不同…

bs架构 erp 进销存_从依赖经验到用柔性ERP,企业少走了多少弯路?

企业在面对紧急订单时&#xff0c;传统企业将面临两难问题&#xff1a;如不接受紧急订单,可能会导致潜在的顾客丢失,损失市场占有率;接受紧急订单,可能会给企业带来很多管理上的问题,如材料采购、库存管理等。而企业通过信息化手段提升生产计划与控制的柔性&#xff0c;则可从容…

云端: 小软件大平台,绿色又安全 V0.9 Beta3(090722)

云端 是一个小软件&#xff0c;但又是一个大平台。安装云端之后&#xff0c;再使用其他软件不再需要安装——一点、下载、直接使用&#xff1b;并且&#xff0c;通过虚拟化的运行环境&#xff0c;能够保持系统长久的干净、绿色&#xff0c;并保持软件与系统的安全隔离——此方面…

MGraph图(代码、分析、汇编)

目录:代码&#xff1a;分析&#xff1a;汇编&#xff1a;MGrapth图表示有邻接矩阵的方式构成的图结构。邻接矩阵用两个数组保存数据&#xff0c;一个一维数组存储图中的顶点信息&#xff0c;一个二维数组存储图中边或弧的信息。无向图中的二维数组是个对称矩阵 1.0表示无边&…

java: 程序包lombok不存在_Java开发神器:Lombok 学习指南

点击上方“Java知音”&#xff0c;选择“置顶公众号”技术文章第一时间送达&#xff01;作者&#xff1a;semlinkerwww.segmentfault.com/a/1190000020864572一、Lombok 简介Lombok 是一款 Java 开发插件&#xff0c;使得 Java 开发者可以通过其定义的一些注解来消除业务工程中…

AAC ADTS格式分析

AAC ADTS格式分析&#xff1a; 没有详细的参数说明&#xff0c;只有格式分析。可以查询文档查看详细参数说明。 ADTS的全称是Audio Data Transport Stream。是AAC音频的传输流格 式。AAC音频格式在MPEG-2&#xff08;ISO-13318-7 2003&#xff09;中有定义。AAC后来 又被采用到…

新知道的几个东西

nginx&#xff08;发音同engine x&#xff09;是一款由俄罗斯程序设计师Igor Sysoev所开发轻量级的网页服务器、反向代理服务器以及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。起初是供俄国大型的入口网站及搜寻引擎Rambler&#xff08;俄文&#xff1a;Рамбл…

台达plc控制伺服电机编程实例_PLC控制伺服电机:控制脉冲的相关计算

伺服电机PLC通过脉冲的方式控制伺服电机时&#xff0c;其输出脉冲与伺服电机的配置应具有一定的对应关系。如&#xff0c;PLC输出多少个脉冲电机旋转一圈&#xff1f;电机旋转一圈移动的距离(或角度)是多少&#xff1f;这里我们以某伺服电机为例进行举例说明&#xff1a;完成对…

实验四 Windows程序设计

1&#xff0c;创建Windows窗体应用程序&#xff0c;实现用户登录功能&#xff0c;当输入正确与错误时均给出相应的提示信息&#xff0c;规定用户输入错误次数不能超过3次。&#xff08;源代码运行界面&#xff09; 这里的口令有个小常识&#xff0c;就是显示*&#xff0c;在口令…

最小连通-(代码、分析、汇编)

目录&#xff1a;介绍&#xff1a;代码&#xff1a;分析&#xff1a;汇编&#xff1a;介绍&#xff1a; 一个有 n 个结点的连通图的生成树是原图的极小连通子图&#xff0c;且包含原图中的所有 n 个结点&#xff0c; 并且有保持图连通的最少的边。 最小生成树可以用kruskal&am…

c++ 怎样连接两个链表_LeetCode | 链表的入口,一文帮你搞定“环形链表”(python版,最简单解析)...

链表节点的定义链表作为一种数据结构&#xff0c;由链表节点互相连接构成。链表节点包含自身的数据和一个指向下一节点的指针。""" Definition of ListNode """ class ListNode(object):def __init__(self, val, nextNone):self.val valself.ne…