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

目录:

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

代码:

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,一经查实,立即删除!

相关文章

window service服务安装错误

今天按照园子里面的文章&#xff0c;弄了一个系统服务&#xff0c;可是一直装不上去&#xff0c; 正在运行事务处理安装。 正在开始安装的“安装”阶段。查看日志文件的内容以获得 D:\TecCreateSvc\TecJsCreateService.exe 程序集的进度。该文件位于 D:\TecCreateSvc\TecJsCre…

DM9000调试记录

最近在调试DM9000&#xff0c;遇到了很多问题&#xff0c;在网上几乎也能找到同样的问题&#xff0c;但是答案千变万化&#xff0c;弄的我这样不行&#xff0c;那样也不行。 1、遇到的第一个问题&#xff0c;网卡不识别&#xff0c;出现的调试信息就是&#xff1a; dm9000 dm90…

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…

Python datetime isocalendar()方法与示例

Python datetime.isocalendar()方法 (Python datetime.isocalendar() Method) datetime.isocalendar() method is used to manipulate objects of datetime class of module datetime. datetime.isocalendar()方法用于操作模块datetime的datetime类的对象。 It uses a dateti…

ASP.NET 技术(附翻译)

1.构建 ASP.NET 页面ASP.NET 和ASP.NET结构ASP.NET 是微软.NET framework整体的一部分, 它包含一组大量的编程用的类&#xff0c;满足各种编程需要。 在下列的二个部分中, 你如何学会 ASP.NET 很适合的放在.NET framework, 和学会能在你的 ASP.NET 页面中使用语言。.NET类库假想…

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…

Java Vector insertElementAt()方法与示例

矢量类insertElementAt()方法 (Vector Class insertElementAt() method) insertElementAt() method is available in java.util package. insertElementAt()方法在java.util包中可用。 insertElementAt() method is used to set the given element (ele) at the given (indices…

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

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

SendMessage和PostMessage

SendMessage 和 PostMessage 的区别 &#xff11;、首先是返回值意义的区别&#xff0c;我们先看一下 MSDN 里的声明&#xff1a; LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);BOOL PostMessage( HWND hWnd…

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…

java timezone_Java TimeZone getDSTSavings()方法与示例

java timezoneTimeZone类的getDSTSavings()方法 (TimeZone Class getDSTSavings() method) getDSTSavings() method is available in java.util package. getDSTSavings()方法在java.util包中可用。 getDSTSavings() method is used to get the number of time differences in …

Photoshop 保存PNG格式交错和不交错有差别

1.PNG格式是由Netscape公司开发出来的格式&#xff0c;可以用于网络图像&#xff0c;但它不同于GIF格式图像只能保存256色&#xff0c;PNG格式可以保存24位的真彩色图像&#xff0c;并且支持透明背景和消除锯齿边缘的功能&#xff0c;可以在不失真的情况下压缩保存图像。但由于…

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

目录&#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;比较相邻元素的…

ubuntu 无线 共享 上网

配置DHCP服务器 使连接到此AP的电脑 自动获取IP 1. 安装软件包&#xff1a;sudo apt-get install dhcp3-server2. 修改/etc/default/dhcp3-server配置文件INTERFACES"eth1" //eth1为无线网卡的名字3. 修改/etc/dhcp3/dhcpd.conf配置文件option domain-name-servers …

Java StringBuilder getChars()方法与示例

StringBuilder类的getChars()方法 (StringBuilder Class getChars() method) getChars() method is available in java.lang package. getChars()方法在java.lang包中可用。 getChars() method is used to copy all the characters from the given arguments (int src_st, int …

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

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

不具有继承关系的Delegate如何进行类型转换?

- 引自:Artech 我们知道对于两个不具有继承关系的两个类型&#xff0c;如果没有为它们定义转换器&#xff0c;两这之间的类型转换是不允许的&#xff0c;Delegate也是如此。但是有时候我们却希望“兼容”的两种Delegate类型能够进行转换&#xff0c;比较典型的就是表示事件的De…

Java属性loadFromXML()方法与示例

属性类loadFromXML()方法 (Properties Class loadFromXML() method) loadFromXML() method is available in java.util package. loadFromXML()方法在java.util包中可用。 loadFromXML() method is used to load all the properties denoted by the XML file on the given inpu…