首页 > 代码库 > B-树和B+树

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

 

技术分享

 

B-树和B+树