引言

关于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;
}

【数据结构】B/B-树(目录树)相关推荐

  1. 第十五节:Expression表达式目录树(与委托的区别、自行拼接、总结几类实例间的拷贝)

    一. 基本介绍 回忆: 最早接触到表达式目录树(Expression)可能要追溯到几年前使用EF早期的时候,发现where方法里的参数是Expression<Func<T,bool> ...

  2. 表达式目录树(Expression)

    表达式目录树 什么是表达式目录树呢?用于表示Lambda表达式逻辑的一种数据结构,表达式树也可以称作表达式目录树,它 将代码表示成一个对象树,而不是可执行的代码.这个跟汇编原理一样,我们找到关键字,把 ...

  3. 数据结构与算法一览(树、图、排序算法、搜索算法等)- Review

    算法基础简介 - OI Wiki (oi-wiki.org) 文章目录 1. 数据结构介绍 1.1 什么是数据结构 1.2 数据结构分类 2. 链表.栈.队列:略 3. 哈希表:略 4. 树 4.1 ...

  4. 『数据结构与算法』解读树(Tree)和二叉树(Binary Tree)!

    『数据结构与算法』解读树(Tree)和二叉树(Binary Tree)! 文章目录 一. 树 1.1. 树的定义 1.2. 树的基本术语 1.3. 树的性质 二. 二叉树 2.1. 二叉树的定义 2. ...

  5. 数据结构“基于哈夫曼树的数据压缩算法”的实验报告

    一个不知名大学生,江湖人称菜狗 original author: jacky Li Email : 3435673055@qq.com Last edited: 2022.11.20 目录 数据结构& ...

  6. 用Ajax做的一棵无限级目录树

    转载:快乐笛子的博客(http://www.happyshow.org/view.php?id=107) 演示地址:http://www.happyshow.org/sample/20060918/a ...

  7. Expression 表达式目录树一

    这里有两段代码: 看一下 Where 的参数 Linq To object 的 where 方法需要的参数是 委托 Linq To Sql的 where 方法需要的参数  是被 Expression ...

  8. C# Expression表达式目录树

    Expression就是表达式目录树,是以树形数据结构表示代码,其中每一个节点都是一种表达式. 用lambda表达式来创建一个简单的Expression 使用lambda表达式,编译器在生成IL时会帮 ...

  9. 二、HBase的核心数据结构 跳跃表、LSM树、布隆过滤器

    文章目录 HBase的核心数据结构 跳跃表(SkipList) LSM树 布隆过滤器 布隆过滤器算法示例 HBase与布隆过滤器 HBase的核心数据结构 HBase的一个列簇(Column Fami ...

  10. 《大话数据结构》6、7树、图

    第6章树 149 树: 树 (Tree) 是 n (n>=0) 个结点的有限集 . n=0 时称为空树. 在任意一棵非空 树中: ( 1 ) 有旦仅有一个特定的称为根 (Root) 的结点: ( ...

最新文章

  1. aliyun tianchi ai contest meeting note
  2. [转]Android 项目的代码混淆,Android proguard 使用说明
  3. 7-26 Windows消息队列(25 分)
  4. python多线程实现for循环_Python多线程实现同时执行两个while循环
  5. 降为千元机!小米6X 6+64G版到手价999元
  6. 【maven】maven dependencyManagement 锁定Jar包版本
  7. 这是我见过对 IOC 和 DI 解释的最清楚的一篇文章了!
  8. ubuntu16.04中将自己的ubuntu做成镜像
  9. 追忆童年系列:记一次寻找Flash小游戏的经历
  10. 前后端分离的跨域请求问题解决
  11. 虚拟化、文件系统、查找文件
  12. 华芯微特SWM320TFT屏人机交互方案手册
  13. python word转pdf linux_Linux下使用LibreOffice+python将doc/docx/wps格式的文档转成html/txt/docx等格式...
  14. 蒲公英内测分发平台使用体验
  15. 内网穿透+ssh登录打造私人云服务器
  16. 刷脸支付助力互联网产业时代全面到来
  17. 民用对讲机的基础知识
  18. unity2D小游戏打地鼠
  19. 比FlashGet好用的FlashGet
  20. linux查看进程的信息失败,Linux查看端口、进程信息

热门文章

  1. PlumeLog-Java分布式日志组件,支持百亿级别,日志从搜集到查询,不用去文件中翻阅日志方便快捷
  2. 华裔计算机科学家图灵奖,首位获得图灵奖的华裔科学家-姚期智
  3. 计算机应用研究、计算机工程与应用、计算机科学与探索投稿经验
  4. XCODe运行yueyu设置
  5. 长波猝灭剂QSY 21NHS,304014-13-9,QSY21 活性酯特点有哪些
  6. 让我摘下星星送给你_抖音中摘下星星给你摘下月亮的歌词是什么歌 星球坠落歌词在哪听...
  7. synopsys工具介绍
  8. python123课题的答案_python 练习 选课系统 项目
  9. 光场相机重聚焦原理②——Lytro Illum记录光场
  10. 什么是spring,他能够做什么