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