数据结构【查找】—B树
/*********************讲解后期补充*****************/
先上代码
#include "000库函数.h" #define MAXSIZE 100//存储空间 #define m 3//B树的阶
#define N 17//数据元素的个数
#define MAX 5//字符串的最大长度 struct BTree
{
int keynum;//节点中关键字的个数 即节点大小
BTree *parent;//指向双亲的指针
struct Node//节点向量类型
{
int key;//关键字向量
BTree *ptr;//子树指针向量
int recptr;//记录指针向量
};
Node node[m + ];//0号单元未使用
}; struct Result{
BTree *pt;//指向找到的节点
int i;//在节点中的关键字序号
int tag;//查找成功与否
}; int Search(BTree *p, int elem) {//p.node[i].key<=elem<p.node[i+1].key
int j;
for (int i = ; i < p->keynum; ++i)
if (p->node[i].key <= elem)
j = i;
return j;
} //查找B树中是否存在该数
/*关键字应该插在指针pt所指节点中的第i和第i+1个关键字之间*/
Result* SearchBTree(BTree *T, int elem) {
BTree *p, *q;
p = T;
q = NULL;
int find = false;
Result *r = new Result;
int i = ;
while (p && !find) {
i = Search(p, elem);//p.node[i].key<=elem<p.node[i+1].key
if (i > && p->node[i].key == elem)//查找到了关键字
find = true;
else {
q = p;
p = p->node[i].ptr;
}
}
r->i = i;
if(find){//查找成功
r->pt = p;
r->tag = ;
}
else {//查找不成功,返回elem的插入位置的信息
r->pt = q;
r->tag = ;
}
return r;
} /* 将r->key、r和ap分别插入到q->key[i+1]、q->recptr[i+1]和q->ptr[i+1]中 */
int Insert(BTree* &pt, int n, int rx, BTree *ap) {
for (int i = pt->keynum; i > n; --i)//空出pt->node[n+1]
pt->node[i + ] = pt->node[i];//向后挪,腾出位置来
pt->node[n + ].key = rx;
pt->node[n + ].ptr = ap;
pt->node[n + ].recptr = rx;
pt->keynum++;
return true;
} /* 将结点q分裂成两个结点,前一半保留,后一半移入新生结点ap */
int split(BTree* &pt, BTree* &ap) {
int s = (m + ) / ;
ap = new BTree;//生成新的节点ap
ap->node[].ptr = pt->node[s].ptr;//后一半移入ap中
for (int i = s + ; i < m; ++i) {
ap->node[i - s] = pt->node[i];
if (ap->node[i - s].ptr)
ap->node[i - s].ptr->parent = ap;
}
ap->keynum = m - s;
ap->parent = pt->parent;
pt->keynum = s - ;/* q的前一半保留,修改keynum */ return true;
} /* 生成含信息(T,r,ap)的新的根结点&T,原T和ap为子树指针 */
int NewRoot(BTree *T, int key, BTree *ap) {
BTree *p = new BTree;
p->node[].ptr = T;
T = p;
if (T->node[].ptr)
T->node[].ptr->parent = T;
T->parent = NULL;
T->keynum = ;
T->node[].key = key;
T->node[].recptr = key;
T->node[].ptr = ap;
if (T->node[].ptr)
T->node[].ptr->parent = T; return true;
} /* 在m阶B树T上结点*q的key[i]与key[i+1]之间插入关键字K的指针r。若引起 */
/* 结点过大,则沿双亲链进行必要的结点分裂调整,使T仍是m阶B树。 */
int InsertBTree(BTree* &T, int elem, BTree *pt, int n) {
BTree *ap;
ap = new BTree;
bool finished = false;
int s, rx;
rx = elem;
while (pt && !finished) {
Insert(pt, n, rx, ap);// 将r->key、r和ap分别插入到q->key[i+1]、q->recptr[n+1]和q->ptr[n+1]中 */
if (pt->keynum < m)
finished = true;//插入成功
else {//对节点进行分裂
s = (m + ) / ;
rx = pt->node[s].recptr;
split(pt, ap);/* 将q->key[s+1..m],q->ptr[s..m]和q->recptr[s+1..m]移入新结点*ap */
pt = pt->parent;
if (pt)
n = Search(pt, elem);//在双亲结点中*q中查找rx->key的插入位置
}
}
if (!finished)/* T是空树(参数q初值为NULL)或根结点已分裂为结点*q和*ap */
NewRoot(T, rx, ap);/* 生成含信息(T,rx,ap)的新的根结点*T,原T和ap为子树指针 */ return true;
} int T034()
{
int r[N] = { ,,,,,,,,,,,,,,,, };
BTree *T = new BTree;
T = NULL;
Result *s;
for (int i = ; i < N; i++)
{
s = SearchBTree(T, r[i]);
if (!s->tag)
InsertBTree(T, r[i], s->pt, s->i);
}
printf("\n请输入待查找记录的关键字: ");
int a;
scanf("%d", &a);
s = SearchBTree(T, a);
if (s->tag)
printf("(%d)", (s->pt)->node[a].key);
else
printf("没找到");
printf("\n"); return ;
}
数据结构【查找】—B树的更多相关文章
- D&F学数据结构系列——B树(B-树和B+树)介绍
B树 定义:一棵B树T是具有如下性质的有根树: 1)每个节点X有以下域: a)n[x],当前存储在X节点中的关键字数, b)n[x]个关键字本身,以非降序存放,因此key1[x]<=key2[x ...
- 【经典数据结构】B树与B+树
本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 维基百科对B树的定义为“在计算机科学中,B树 ...
- Linux 内核中的数据结构:基数树(radix tree)
转自:https://www.cnblogs.com/wuchanming/p/3824990.html 基数(radix)树 Linux基数树(radix tree)是将指针与long整数键值相 ...
- 【经典数据结构】B树与B+树(转)
本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 维基百科对B树的定义为“在计算机科学中,B树 ...
- 【经典数据结构】B树与B+树的解释
本文转载自:http://www.cnblogs.com/yangecnu/p/Introduce-B-Tree-and-B-Plus-Tree.html 前面讲解了平衡查找树中的2-3树以及其实现红 ...
- 数据结构-PHP 线段树的实现
转: 数据结构-PHP 线段树的实现 1.线段树介绍 线段树是基于区间的统计查询,线段树是一种 二叉搜索树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点.使用线段树可以快速的查 ...
- 数据结构之AVL树
AVL树是高度平衡的而二叉树.它的特点是:AVL树中任何节点的两个子树的高度最大差别为1. 旋转 如果在AVL树中进行插入或删除节点后,可能导致AVL树失去平衡.这种失去平衡的可以概括为4种姿态:LL ...
- 查找->静态查找表->次优查找(静态树表)
文字描算 之前分析顺序查找和折半查找的算法性能都是在“等概率”的前提下进行的,但是如果有序表中各记录的查找概率不等呢?换句话说,概率不等的情况下,描述查找过程的判定树为何类二叉树,其查找性能最佳? 如 ...
- 数据结构与算法->树->2-3-4树的查找,添加,删除(Java)
代码: 兵马未动,粮草先行 作者: 传说中的汽水枪 如有错误,请留言指正,欢迎一起探讨. 转载请注明出处. 目录 一. 2-3-4树的定义 二. 2-3-4树数据结构定义 三. 2-3-4树的可以得到 ...
- 数据结构实验7:实现二分查找、二叉排序(查找)树和AVL树
实验7 学号: 姓名: 专业: 7.1实验目的 (1) 掌握顺序表的查找方法,尤其是二分查找方法. (2) 掌握二叉排序树的建立及查找. 查找是软件设计中的最常用的运算,查找所涉及到 ...
随机推荐
- 分布式系统监视zabbix讲解四之可视化--技术流ken
图形 概述 随着大量的监控数据被采集到Zabbix中,如果用户可以以可视化的表现形式来查看发生了什么事情,那么和仅仅只有数字的表现形式比起来则更加轻松. 以下是进行图形设置的地方.图形可以一目了然地掌 ...
- javascript小实例,在页面中输出当前客户端时间
时间对象(Date())比较简单,本文旨在为初学者入门使用,大牛可略过! 本文承接基础知识实例,说一下实例的要求: 在页面中输出当前客户端时间(2015年1月1日星期一10:10:10这样的格式),每 ...
- 在Fragment中保存WebView状态
http://www.lucazanini.eu/2013/android/how-to-save-the-state-of-a-webview-inside-a-fragment-of-an-act ...
- 【转载】阿里云ECS服务器监控资源使用情况
在阿里云Ecs服务器运维过程中,无论是Centos系统还是Windows系统,有时候我们需要监控分析最新的服务器资源利用率等运行情况,例如最近3个小时CPU使用率情况.内存使用率.网络流入带宽.网络流 ...
- [android] 帧布局
/*******************2016年5月3日 更新**************************************/ 知乎:如何理解andriod中的View和framela ...
- spring_03ApplicationContext三种经常用到的实现
1.ClassPathXmlApplicationContext从类路径加载 ApplicationContext ac=new ClassPathXmlApplicationContext(&quo ...
- 为什么需要把页面放在WEB-INF文件夹下面?
1.基于不同的功能 JSP 被放置在不同的目录下 这种方法的问题是这些页面文件容易被偷看到源代码,或被直接调用.某些场合下这可能不是个大问题,可是在特定情形中却可能构成安全隐患.用户可以绕过Strut ...
- 2017-11-09 中英文代码对比系列之Java一例
原文: https://zhuanlan.zhihu.com/p/30905033. 作者为本人. 这个系列将对同一段代码进行中文命名和英文命名两个版本的比较. 目的包括, 演示中文命名, 发现命名时 ...
- iPhone手机怎么投屏到电脑 airplay在哪里设置
iPhone手机怎么投屏到电脑?想要小屏转大屏,其实方法很简单,简单几步就可以操作,下面简单几步教大家手机投屏电脑的方法. 使用工具: Iphone&电脑 操作方法: 1.如果想要把手机本地的 ...
- 轻松搭建Xposed Hook
0x2.导入xposed库文件XposedBridgeApi-XX.jar,将库文件放在app/lib目录下,自己创建一个lib目录,别放在libs目录下,否则会出错,然后导入库,修改 Scope 为 ...