二叉排序树(BSTree)关于查找算法结合

/*基于树的顺序查找法*/
/*二叉排序树的存储结构*/
typedef struct node {
    KeyType key;                      /*关键字的值*/
    struct node *lchild, *rchild;     /*左右指针*/
} NSTNode, *BSTree;
/*二叉排序树插入递归算法*/
void InsertBST(BSTree *bst, KeyType key) {
    BiTree s;
    if(*bst == NULL) {
        s = (BSTree)malloc(sizeof(BSTNode));
        s->key = key;
        s->lchild = NULL; s->rchild = NULL;
        *bst = s;
    }
    else if(key < (*bst)->key) {
        InsertBST(&((*bst)->lchild), key);
    }
    else if(key > (*bst)->rchild, key) {
        InsertBST(&((*bst)->rchild), key);
    }
/*创建二叉排序树*/
void CreateBST(BSTree *bst) {
    KeyType key;
    *bst = NULL;
    scanf("%d", &key);
    while(key != ENDKEY) {      /*ENDKEY为自定义常量*/
        InsertBST(bst, key);
        scanf("%d", &key);
    }
}
/*二叉排序树查找的递归算法*/
BSTree SearchBST(BSTree bst, KeyType key) {
    if(!bst) return NULL;
    else if(bst->key = key) return bst;
    else if(bst->key > key) return SearchBST(bst->lchild, key);
    else return SearchBST(bst->rchild,key);
}
/*二叉排序树查找的非递归算法*/
BSTree SearchBST(BSTree bst, KeyType key) {
    BSTree q;
    q = bst;
    while(q) {
        if(q->key == key) {
            return q;
        }
        if(q->key > key) {
            q = q->lchild;
        }
        else q = q->rchild;
    }
    return NULL;
}
/*二叉排序树的删除*/
BSTree* DelBST(BSTree t, KeyType k) {
    BSTNode *p,*f,*s,*q;
    p = t; f =NULL;
    while(p) {
        if(p->key == key) break;
        f = p;     /*f指向p结点的双亲结点*/
        if(p->key > key) p = p->lchild;
        else p = p->rchild;
    }    /*以上步骤找到p在二叉排序树中的位置*/
    if(p == NULL) return t;    /*若找不到,返回原来的二叉排序树*/

    if(p->lchild == NULL) {    /*p无左子树*/
        if(f = NULL) {         /*如果根结点就是要删除的结点*/
            t = p->rchild;     /*t右子树置为根*/
        }
        else if(f->lchild == p) {    /*如果p是f的左孩子*/
            f->lchild = p->rchild;   /*将p的右子树连在f的左链上*/
        }
        else {     /*如果p是f的右孩子*/
            f->rchild = p->rchild;  /*将p的右子树连在f的右链上*/
        }
        free(p);

    }
    else {     /*p有左子树*/
        q = p; s = p->lchild;
        while(s->rchild) {
            q = s; s = s->rchild;     /*在p的左子树中找最右下结点*/
        }
        if(q == p) {                  /*如果p的左子树没有右子树*/
            q->lchild = s->lchild;    /*将s的左子树连到q(此时即为p)上*/
        }
        else {                        /*如果p的左子树有右子树 此时s为最右下结点*/
            q->rchild = s->lchild;
        }
        p->key = s->key;             /*将s的值赋给p*/
        free(s);
    }
    return t;
}


知乎:Solo | 微博@从流域到海域

    原文作者:排序算法
    原文地址: https://blog.csdn.net/solo95/article/details/51457074
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞