基础介绍

是多节点的树,可以用在磁盘数据的查找上。

代码

#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0#define MAXSIZE 100 /* 存储空间初始分配量 */#define m 3 /*  B树的阶,暂设为3 */
#define N 17 /*  数据元素个数 */
#define MAX 5 /*  字符串最大长度+1  */typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */typedef struct BTNode
{int keynum; /*  结点中关键字个数,即结点的大小 */struct BTNode* parent; /*  指向双亲结点 */struct Node /*  结点向量类型 */{int key; /*  关键字向量 */struct BTNode* ptr; /*  子树指针向量 */int recptr; /*  记录指针向量 */}node[m + 1]; /*  key,recptr的0号单元未用 */
}BTNode, * BTree; /*  B树结点和B树的类型 */typedef struct
{BTNode* pt; /*  指向找到的结点 */int i; /*  1..m,在结点中的关键字序号 */int tag; /*  1:查找成功,O:查找失败 */
}Result; /*  B树的查找结果类型 *//*  在p->node[1..keynum].key中查找i,使得p->node[i].key≤K<p->node[i+1].key */
int Search(BTree p, int K)
{int i = 0, j;for (j = 1; j <= p->keynum; j++)if (p->node[j].key <= K)i = j;return i;
}/*  在m阶B树T上查找关键字K,返回结果(pt,i,tag)。若查找成功,则特征值 */
/*  tag=1,指针pt所指结点中第i个关键字等于K;否则特征值tag=0,等于K的  */
/*  关键字应插入在指针Pt所指结点中第i和第i+1个关键字之间。 */
Result SearchBTree(BTree T, int K)
{BTree p = T, q = NULL; /*  初始化,p指向待查结点,q指向p的双亲  */Status found = FALSE;int i = 0;Result r;while (p && !found){i = Search(p, K); /*  p->node[i].key≤K<p->node[i+1].key  */if (i > 0 && p->node[i].key == K) /*  找到待查关键字 */found = TRUE;else{q = p;p = p->node[i].ptr;}}r.i = i;if (found) /*  查找成功  */{r.pt = p;r.tag = 1;}else /*   查找不成功,返回K的插入位置信息 */{r.pt = q;r.tag = 0;}return r;
}/* 将r->key、r和ap分别插入到q->key[i+1]、q->recptr[i+1]和q->ptr[i+1]中 */
void Insert(BTree* q, int i, int key, BTree ap)
{int j;for (j = (*q)->keynum; j > i; j--) /*  空出(*q)->node[i+1]  */(*q)->node[j + 1] = (*q)->node[j];(*q)->node[i + 1].key = key;(*q)->node[i + 1].ptr = ap;(*q)->node[i + 1].recptr = key;(*q)->keynum++;
}/* 将结点q分裂成两个结点,前一半保留,后一半移入新生结点ap */
void split(BTree* q, BTree* ap)
{int i, s = (m + 1) / 2;*ap = (BTree)malloc(sizeof(BTNode)); /*  生成新结点ap */(*ap)->node[0].ptr = (*q)->node[s].ptr; /*  后一半移入ap */for (i = s + 1; i <= m; i++){(*ap)->node[i - s] = (*q)->node[i];if ((*ap)->node[i - s].ptr)(*ap)->node[i - s].ptr->parent = *ap;}(*ap)->keynum = m - s;(*ap)->parent = (*q)->parent;(*q)->keynum = s - 1; /*  q的前一半保留,修改keynum */
}/* 生成含信息(T,r,ap)的新的根结点&T,原T和ap为子树指针 */
void NewRoot(BTree* T, int key, BTree ap)
{BTree p;p = (BTree)malloc(sizeof(BTNode));p->node[0].ptr = *T;*T = p;if ((*T)->node[0].ptr)(*T)->node[0].ptr->parent = *T;(*T)->parent = NULL;(*T)->keynum = 1;(*T)->node[1].key = key;(*T)->node[1].recptr = key;(*T)->node[1].ptr = ap;if ((*T)->node[1].ptr)(*T)->node[1].ptr->parent = *T;
}/*  在m阶B树T上结点*q的key[i]与key[i+1]之间插入关键字K的指针r。若引起 */
/*  结点过大,则沿双亲链进行必要的结点分裂调整,使T仍是m阶B树。 */
void InsertBTree(BTree* T, int key, BTree q, int i)
{BTree ap = NULL;Status finished = FALSE;int s;int rx;rx = key;while (q && !finished){Insert(&q, i, rx, ap); /*  将r->key、r和ap分别插入到q->key[i+1]、q->recptr[i+1]和q->ptr[i+1]中  */if (q->keynum < m)finished = TRUE; /*  插入完成 */else{ /*  分裂结点*q */s = (m + 1) / 2;rx = q->node[s].recptr;split(&q, &ap); /*  将q->key[s+1..m],q->ptr[s..m]和q->recptr[s+1..m]移入新结点*ap  */q = q->parent;if (q)i = Search(q, key); /*  在双亲结点*q中查找rx->key的插入位置  */}}if (!finished) /*  T是空树(参数q初值为NULL)或根结点已分裂为结点*q和*ap */NewRoot(T, rx, ap); /*  生成含信息(T,rx,ap)的新的根结点*T,原T和ap为子树指针 */
}void print(BTNode c, int i) /*  TraverseDSTable()调用的函数  */
{printf("(%d)", c.node[i].key);
}int main()
{int r[N] = { 22,16,41,58,8,11,12,16,17,22,23,31,41,52,58,59,61 };BTree T = NULL;Result s;int i;for (i = 0; i < N; i++){s = SearchBTree(T, r[i]);if (!s.tag)InsertBTree(&T, r[i], s.pt, s.i);}printf("\n请输入待查找记录的关键字: ");scanf_s("%d", &i);s = SearchBTree(T, i);if (s.tag)print(*(s.pt), s.i);elseprintf("没找到");printf("\n");return 0;
}

大话数据结构:多路查找相关推荐

  1. 【Java】 大话数据结构(13) 查找算法(4) (散列表(哈希表))

    本文根据<大话数据结构>一书,实现了Java版的一个简单的散列表(哈希表). 基本概念 对关键字key,将其值存放在f(key)的存储位置上.由此,在查找时不需比较,只需计算出f(key) ...

  2. 数据结构 多路查找树 ---------B树和B+树的简单介绍

    参考链接:微信公众号 程序员小灰 https://mp.weixin.qq.com/s/rDCEFzoKHIjyHfI_bsz5Rw https://mp.weixin.qq.com/s/jRZMMO ...

  3. 大话数据结构之图-查找算法(C++)

    大话数据结构 Unit7 查找 查找算法举例 代码 #include<iostream> using namespace std;//顺序查找 //a为数组,n为数组长度,key为关键字 ...

  4. 《大话数据结构》读书笔记-查找

    写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书,如有侵权,请联系删除. 文章目录 8.1 开场白 8.2 查找概论 8. ...

  5. 《数据结构与算法》(十九)- 多路查找树

    目录 前言 1. 多路查找树(B树) 1) 2-3树 1.1) 2-3树的插入实现 1.2) 2-3树的删除实现 2) 2-3-4树 3) B树 4) B+树 2. 总结 原文地址:https://p ...

  6. 大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 21

    大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 211 第 ...

  7. 数据结构—2-3树、2-3-4树、B树、B+树等多路查找树的原理详解

    详细介绍了多路查找树中的2-3树.2-3-4树.B树.B+树的概念的区别,以及它们的应用场景. 文章目录 1 多路查找树的概述 1.1 索引概述 1.2 多路查找树的引出 2 2-3树 2.1 2-3 ...

  8. 《大话数据结构》8、9查找、排序

    第8章查找 291 查找: 查找 (Searching) 就是根据给定的某个值,在查找表中确定一个其关键字等 于给定值的数据元素 〈或记录〉. 8.1开场白 292 当你精心写了一篇博文或者上传一组照 ...

  9. 《大话数据结构》笔记——第8章 查找(二)

    文章目录 8.6 二叉排序树 8.6.1 二叉排序树查找操作 8.6.2 二叉排序树插入操作 8.6.3 二叉排序树删除操作 8.6.4 二叉排序树总结 8.7 平衡二叉树( AVL树 ) 8.7.1 ...

  10. 数据结构与算法之多路查找树(2-3树、2-3-4树、B树、B+树)

    目录 为什么使用多路查找树 二叉树存在的问题 多路查找树 2-3树 2-3树插入的操作 2-3树删除的操作 2-3-4树 2-3-4树的插入操作 2-3-4树的删除操作 B树 B+树 总结 为什么使用 ...

最新文章

  1. 人工智能AI-机器视觉CV-数据挖掘DM-机器学习ML-神经网络-[资料集合贴]
  2. .NET新手系列(六)
  3. 计算机基础知识与基本操作txt,计算机基础知识复习-20210707023705.pdf-原创力文档...
  4. 已解决:大家使用原子哥的延时函数delay_ms,delay_us会出现进入延时函数出不来的情况
  5. 设计模式 - 适配器模式
  6. [转]软件测试的完整分类
  7. html文件压缩成gzip,前端性能优化成神之路-HTTP压缩开启gzip
  8. 算法复杂度分析(下):最好、最坏、平均、均摊等时间复杂度概述
  9. ctfshow-WEB-web14( 利用数据库读写功能读取网站敏感文件)
  10. [译] Martin Fowler - Web 应用安全基础
  11. SharePoint 2013 Preview Single Server 评估环境安装与简单试用
  12. Gridview DetailView
  13. 记一次springboot应用偶发502错误的排查过程
  14. java黄金分割点游戏_结对编程--黄金分割点游戏
  15. ORA-1653: unable to extend table by 1024 in tablespace(oracle表空间满了的解决方案)
  16. 用类描述计算机CPU的速度和硬件的容量
  17. ce修改面板属性_改属性【dnfce修改器吧】_百度贴吧
  18. Latex之在caption里加footnote
  19. 等级保护测评策略建议整改措施
  20. 在android手机上运行PHP 1

热门文章

  1. Android-04:线程的使用
  2. nc——制作后门连接与反弹shell连接的使用
  3. ionic3实战之—Radio传值
  4. Ajax请求Session超时解决
  5. 重拾python Day 2
  6. C++11:using 的各种作用
  7. ubuntuKylin17.04重装KDE
  8. 三维重建:深度相机方案对比-KinectFusion的基本原理(尺度)
  9. %rowtype mysql_Oracle %type和%rowtype小实例
  10. 作为医生,除了买花,还能在情人节用什么特别的方式表白呢?(情书-病历体)...