(保留版权,欢迎转载。请注明原始链接:http://blog.csdn.net/markcnsc/article/details/8568822)
二叉搜索树(BST),平衡二叉树(AVL),红黑树,B*树和Tre树。
二叉搜索树(BST)
1. 定义
左子树上任意的值Kl <= 结点N的值Kn <= 右子树上任意的值Kr。
2. 性质
中序遍历BST,可得二叉树所有结点的值的非降序排列。
3. 操作
3.1. 声明
typedef struct _BST {
struct _BST *lc, *rc;
int k;
} BST;
3.2 查找
BST* Search (BST* p, int v)
{
while (p && p->k != v)
p = p->k > v ? p->lc : p->rc;
/*while (p)//strictly, more efficient!
if (p->k > v) p = p->lc; else if (p->k < v) p = p->rc; else break;*/
return p;
}
3.3 插入
BST* Insert (BST** p, int v)
{
while (*p && (*p)->k != v)
p = (*p)->k > v ? &(*p)->lc : &(*p)->rc;
if (!*p) {
if(!(*p = malloc (sizeof(BST)))) exit (-1);
(*p)->k = v;
(*p)->lc = (*p)->rc = 0;
}
return *p;
}
3.4 删除
int Delete (BST** p, int v)
{
BST* q;
while (*p && (*p)->k != v)
p = (*p)->k > v ? &(*p)->lc : &(*p)->rc;
if (!(q = *p)) return -1;
if (!(*p)->lc || !(*p)->rc) {
*p = (*p)->lc ? (*p)->lc : (*p)->rc;
}
else {/* also OK exchange lc <-> rc */
for (p = &(*p)->lc; (*p)->rc; p = &(*p)->rc);
q->k = (*p)->k;
q = (*p);
*p = (*p)->lc;
}
free (q);
return 0;
}
3.5 实例
int main (int argc, char** argv)
{
BST* h = NULL;/*Initilization! Or Coredump.*/
int data[] = {38, 55, 64, 78, 35, 99, 32, 67, 88};
int i, n, r;
for (i = 0; i < sizeof(data)/sizeof(data[0]); i ++) {
Insert (&h, data[i]);
}
while (1) {
printf ("input num:\n");
scanf ("%d", &n);
r = Delete (&h, n);
printf ("%d -- %s\n", n, r ? "None" : "Found and Removed");
}
return 0;
}