B-树和B+树

B-树和B+树
是一种平衡的多路查找树,它在文件系统中很有用。
一颗m阶的b-树,或为空树,或满足下列特性的m叉树。
1)树中每个节点至多有m棵子树
2)若根结点不是叶子结点,则至少有两棵子树。
3)除根之外的所有非终端结点至少有[m/2]棵子树;
4) 所有的非终端结点中包含下列信息
(n,A0,K1,A1,K2,A2...,Kn,An)
K(i=1,...,n)为关键字,且Ki<Ki+1(i=1,...,n-1);
A为指向根结点的指针。且Ai-1指向树中所有节点的关键字小于Ki(i=1,...,n),
5)所有叶子节点都出现在同一层次上,并且不带信息。

#define m 3      // 3阶
typedef struct BTNode {
int keynum;        //关键字个数
struct BTNode * parent; //指向双亲结点
KeyType key[m+1];     //关键字向量
struct BTNode * ptr[m+1];  //子树指针向量
Record * recptr[m+1];
} BTNode,*BTree;

typdef struct {
BTNode *pt;
int i;
int tag;
}Result;


键树(digital search trees)数字查找树
自左向右有序
常见两种存储结构
双链表
#define MAXKEYLEN 16
typedef struct {
char ch[MAXKEYLEN];
int num;
}KeysType;

typedef enum{LEAF, BRACH} NodeKind;

typedef struct DLTNode {
char symbol;
truct DLTNode * next;  //指向兄弟的指针
NodeKind kind;
union {
Record * infoptr;    //分子结点的记录指针
struct DLTNode * first; //分支节点的孩子链指针
}
}DLTNode,*DLTree;

Record * SearchDltTree(DLTree T, KeysType K) {
p = T->first; i=0;
while (p && i < K.num) {
 while (p && p->symbol ! K.ch[i]) p = p->next;
 if (p && i<K.num-1) p=p->first;
 ++i;
 }
 if (!p) return NULL;
 else return p->infoptr;
}


typedef struct TrieNode {
NodeKind kind;
union {
   struct {KeyType K; Record* infoptr; } lf; //叶子结点
   struct {TrieNode *ptr[27]; int num; } bh; //分支节点
 };
}TrieNode,*TrieTree;

Record * SearchTrie(TrieTree T, KeysType K) {
for (p=T, i=0;
     p && p->kind == BRANCH && i< K.num;
     p = p->bh.ptr[ord(K.ch[i])], ++i);  // ord 求字符在字母表中的序号
 if (p && p->kind == LEAF && p->lf.K == K )
 return p->lf.infoptr;
 else return NULL;
 }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值