树和二叉树5——树型查找I——BST

来源:互联网 发布:淘宝登不上去说有风险 编辑:程序博客网 时间:2024/05/30 04:41
(保留版权,欢迎转载。请注明原始链接: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;}
原创粉丝点击