【数据结构】B/B-树(目录树)

article/2025/7/30 16:10:35

引言

关于B树的性质

一、B树的结构

请添加图片描述

二、B树的实现

#include<iostream>
using namespace std;
#if 1
//5分支Btree
#define M 5	//奇数
#define MAXSIZE (M-1)	//最多元素个数
#define MINSIZE (M/2)	//最少元素个数	//B树
class Btree
{
public://关键码类型using KeyType = char;//元素类型typedef struct {KeyType key;	//关键码void* infoptr;	//记录集}ElemType;//树结点类型typedef struct BNode{int keysize;				//当前结点中data中挂接关键码的个数struct BNode* parent;		//指向双亲结点ElemType data[M + 1];		//结点下的元素{关键码,记录集}struct BNode* sub[M + 1];	//分支链}BNode;//查询的结果类型class ResultNode {public:BNode* pnode;	//关键码所在的树结点地址int index;		//关键码所在pnode->data的前一个下标bool tag;		//是否存在的标志位 存在true,不存在false;public:ResultNode() :pnode(nullptr), index(-1), tag(false) {}~ResultNode() {}};//申请BNode结点BNode* BuyBNode(){BNode* s = (BNode*)malloc(sizeof(BNode));if (nullptr == s) exit(-1);memset(s, 0, sizeof(BNode));return s;}//申请并初始化根节点BNode* MakeRoot(const ElemType& item, BNode* left, BNode* right){BNode* root = BuyBNode();root->keysize = 1;root->parent = nullptr;root->data[1] = item;if (nullptr != left) {left->parent = root;}if (nullptr != right){right->parent = root;}root->sub[0] = left;root->sub[1] = right;return root;}//pos位置插入item操作void Insert_Item(BNode* ptr, int pos, const ElemType& item, BNode* right){for (int i = ptr->keysize; i > pos; --i){ptr->data[i + 1] = ptr->data[i];ptr->sub[i + 1] = ptr->sub[i];}ptr->data[pos + 1] = item;ptr->sub[pos + 1] = right;++ptr->keysize;}//将ptr中后半截的元素移动到新开辟的s分支中ElemType MoveElem(BNode* s, BNode* ptr, int pos){for (int i = 0, j = pos + 1; j <= ptr->keysize; ++i, ++j){s->data[i] = ptr->data[j];s->sub[i] = ptr->sub[j];if (s->sub[i] != nullptr){s->sub[i]->parent = s;}}ptr->keysize = MINSIZE;s->keysize = MINSIZE;s->parent = ptr->parent;return s->data[0];	//返回哨兵结点的elem}//分裂产生返回新根节点BNode* SplitNewRoot(BNode* ptr){BNode* s = BuyBNode();//将ptr中后半截的元素移动到新开辟的s分支中ElemType item = MoveElem(s, ptr, MINSIZE);if (nullptr == ptr->parent){return MakeRoot(item, ptr, s);}//将item在ptr->parent结点中再进行找位置,插入,再分裂BNode* pa = ptr->parent;int pos = pa->keysize;pa->data[0] = item;	//哨兵位填充while (pos > 0 && item.key < pa->data[pos].key){--pos;}//s是pa的右孩子Insert_Item(pa, pos, item, s);//pa分支满了,对pa进行递归分裂if (pa->keysize > MAXSIZE){return SplitNewRoot(pa);}else{return nullptr;}}
private:BNode* root;	//根节点int size;		//当前树的关键码的个数
public:Btree() :root(nullptr), size(0) {}~Btree() {}//得到root结点地址BNode* GetRoot()const{return root;}//查找关键码ResultNode FindKey(KeyType ch){ResultNode res;	//默认构造nullptr, -1, false;BNode* p = root;while (p != nullptr){p->data[0].key = ch;int index = p->keysize;		//逆序查询while (index > 0 && ch < p->data[index].key){--index;}res.pnode = p;			//结果指向当前的树结点res.index = index;//找到了if (index > 0 && ch == p->data[index].key){res.tag = true;break;}p = p->sub[index];}return res;}//插入ElemTypebool Insert(const ElemType& item){if (nullptr == root){root = MakeRoot(item, nullptr, nullptr);size = 1;return true;}//查找item.key是否存在ResultNode res = FindKey(item.key);//说明已经存在if (res.pnode != nullptr && res.tag) return false;//不存在,从find的res.pnode开始进行插入BNode* ptr = res.pnode;//插入位置int pos = res.index;//插入并后移元素Insert_Item(ptr, pos, item, nullptr);//插入元素后个数 > MAXSIZE,需要分裂重生出新根节点if (nullptr != ptr && ptr->keysize > MAXSIZE){BNode* newroot = SplitNewRoot(ptr);//根节点改变if (newroot != nullptr){root = newroot;}}++size;return true;}//有序输出B树中的所有元素void BTreeShow(BNode* ptr){if (nullptr == ptr) return;BTreeShow(ptr->sub[0]);for (int i = 1; i <= ptr->keysize; ++i){cout << ptr->data[i].key;BTreeShow(ptr->sub[i]);}}
};

三、插入、查询、输出测试

//测试
int main()
{Btree::KeyType ch[] = {"heqwertsycjgkzlxlowrd"};Btree bt;int i = 0;while(ch[i] != '\0'){Btree::ElemType tmp = { ch[i], nullptr };cout << bt.Insert(tmp);++i;}cout << endl;bt.BTreeShow(bt.GetRoot());return 0;
}

在这里插入图片描述


http://chatgpt.dhexx.cn/article/rM1bulR7.shtml

相关文章

【Mybatis】Mybatis将String类型的0存到数据库中的number类型字段中,变成了空;

一、问题 Mybatis将String类型的0存到数据库中的number类型字段中&#xff0c;变成了空&#xff1b; 二、分析 自己写了一个自动写代码的脚本&#xff0c;带入springBatch后&#xff0c;读取文件时&#xff0c;少了序列号0-9的记录&#xff08;10笔一提交&#xff09;&#…

java取数据库number转String

2019独角兽企业重金招聘Python工程师标准>>> BigDecimal bigDecimal(BigDecimal)value; Long lbigDecimal.longValue(); String sbigDecimal.toString(); 转载于:https://my.oschina.net/u/2285090/blog/514110

字符串存入数据库date类型字段

有时候为了计算方便等原因需要将时间以date格式存入数据库&#xff0c;但是前台传过来的数据类型都是字符串&#xff0c;如果将字符串直接插入date类型的字段中会抛&#xff1a;ORA-01861: 文字与格式字符串不匹配。 前台页面有一个表单&#xff0c;如下所示&#xff1a; <…

2018年SCI论文--整合GEO数据挖掘完整复现 八 :STRING数据库构建蛋白质相互作用网络(PPI),cytoscape软件筛选hub基因

文章目录 论文地址STRING数据库PPI网络构建输入差异基因listPPI图保存结果 cytoscape软件筛选hub基因、功能模块输入“string_interactions”文件用cytohHubba插件&#xff0c;筛选top10 Hub基因生存分析用MCODE插件&#xff0c;筛选功能模块 论文地址 STRING数据库 PPI网络构…

string数据库使用和实践第三部分数据处理 流程-参数--后续分析

流程 1.首先要获取蛋白质列表&#xff08;单个/多个&#xff09; 格式&#xff1a;蛋白名称为一个占一行&#xff0c;或者氨基酸序列的通用格式。ID类别&#xff1a;可以为一种&#xff0c;可以为多种混合 2.在对应的数据框中输入蛋白质列表或者上传列表文件后&#xff0c;选择…

spring boot String类型json 存入数据库

效果图&#xff1a; 如图&#xff0c;string类型的json字符串&#xff0c;存入数据库&#xff0c;主要就是解析成map&#xff0c;遍历插入&#xff0c;不多说上干货&#xff1a; PostMapping(value "/currentConfig")public String saveSvConfig(RequestParam(&quo…

jpa @Convert list转String存入数据库

1.问题 list通过jpa直接存入数据库会报错这里需要进行转换 2.代码 1.dto对象 Entity Data Accessors(chain true) public class GameMatch {/*** 主键*/IdGeneratedValue(strategy GenerationType.IDENTITY)private Integer id;/*** 游戏id*/private Integer gameId;/*** …

string数据库使用和实践的第二部分网页展示http://string-db.org/

主页 protein-mode 该模式中&#xff0c;string数据库能够预测到特定物种中的某一个蛋白质的相互作用关系 通过该模式可以获取最多的特异性&#xff0c;但是覆盖面就会较小一些&#xff0c;原因是该模式中&#xff0c;string不会准确的去获取其他物种的直系同源物&#xff0c;取…

蛋白相互作用数据库,STRING使用指南

对于基因组数据分析而言的话&#xff0c;我们能用到网络分析的就是蛋白相互作用分析(protein-protein ineraction, PPI)分析了。 蛋白相互作用分析的数据库有很多&#xff0c;至于为什么选择STRING&#xff0c;还是在于其强大的可视化&#xff0c;以及自定义功能。这样我们可以…

五大常见的数据类型之 String

前言 我们都知道 Redis 提供了丰富的数据类型&#xff0c;常见的有五种&#xff1a;String&#xff08;字符串&#xff09;&#xff0c;Hash&#xff08;哈希&#xff09;&#xff0c;List&#xff08;列表&#xff09;&#xff0c;Set&#xff08;集合&#xff09;、Zset&…

数据库String字符串

char(n) varchar(n) tinyint tinytext text mediumtext longtextchar(0-255)varchar(0-21844) // 63533定长字符串 char()变长字符串 varchar(n) tinytext text mediumtext longtext(4GBtext)-- char varchar tinytext text mediumtext longtext -- 23767-1 21845-1 16383-1…

STRING:蛋白质相互作用(PPI网络)数据库简介

欢迎关注微信公众号《生信修炼手册》! 研究蛋白之间的相互作用网络&#xff0c;有助于挖掘核心的调控基因&#xff0c;目前已经有很多的蛋白质相互作用的数据库&#xff0c;而string绝对是其中覆盖的物种最多&#xff0c;相互作用信息做大的一个&#xff0c;网址如下 https://…

string数据库使用和实践第一部分string数据库介绍

背景 为什么要寻找蛋白质互做关系&#xff1f; 因为只有正确地发现和注释细胞中的所有功能性的相互作用关系&#xff0c;才能对细胞的功能进行系统层面的学习和理解。 大家在收集和展现蛋白质相互作用的信息上&#xff0c;一直在努力地跟上相互作用关系探索的步伐 近年来&#…

解决虚拟机桥接模式无法上网的问题

1.检查IP地址以及网关等信息是否正确 vim /etc/network/interfaces这里设置的是静态ip, auto lo iface lo inet loopback auto eth0 iface eth0 inet stastic address 192.168.43.40 # 设置IP netmask 255.255.255.0 # 设置子网掩码 gateway 192.168.43.19 # 设置网关 首先…

VM虚拟机桥接模式无法联网解决办法

1.桥接模式的意义&#xff1a; 桥接模式----使虚拟机客户机可以和主机在同一网段&#xff0c;这样&#xff0c;和主机同局域网内的其他主机就也可以ping到虚拟机了 2.问题描述&#xff1a; 1.主机和虚拟机客户机相互之间ping不通 2.将虚拟机改为网络模式为NAT模式自动获取I…

虚拟机配置桥接模式(bridge)

使用的Vmware虚拟机软件 需要使用bridge&#xff0c;桥接模式 首先&#xff0c;需要给主机电脑设置IP&#xff0c; 看主机使用的是有线还是无线&#xff0c;使用哪个就设置那个&#xff0c;可以先通过ipconfig/all来查看ip&#xff0c;然后根据实际信息配置网络适配器 手动配置…

虚拟机桥接模式下的网络设置

虚拟机共有三种网络模式&#xff0c;每种网络模式具体的原理参考&#xff1a; Vmware虚拟机三种网络模式详解 - 星朝 - 博客园原文来自http://note.youdao.com/share/web/file.html?id236896997b6ffbaa8e0d92eacd13abbf&typenote 我怕链https://www.cnblogs.com/jpfss/p/…

Virtualbox虚拟机桥接模式配置

VirtualBox提供了多种网络连接方式&#xff0c;不同的网络连接方式决定了虚拟机是否可以联网&#xff0c;以及是否可以和宿主机互相ping通 亲测之后总结一些在配置NAT模式和仅主机模式所踩的坑&#xff0c;最后选择了桥接模式 NAT模式&#xff1a;宿主机ping不通虚拟机&#…

VM虚拟机桥接模式设置固定IP

目录 一、VM虚拟机续订 二、Linux配置静态IP 一、VM虚拟机续订 选中虚拟机——>设置——>网络适配器 官方说明&#xff1a; 如果在笔记本电脑或其他移动设备上使用虚拟机&#xff0c;请选择复制物理网络连接状态。 当您在有线或无线网络之间进行移动时&#xff0c;该…

虚拟机桥接模式连不上网问题(非桥接网卡原因)

虚拟机和宿主机可以互相ping通&#xff0c;但是ping www.baidu.com不能成功 常见的原因是桥接到的网卡不对&#xff0c;网上搜也是大部分搜到这种原因解决办法。 参见解决VMware虚拟机桥接模式上不了网 我遇到的问题不是这个&#xff0c;是因为我没有配置网关。。。。。 真…