zoukankan      html  css  js  c++  java
  • 二叉排序树(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 | 微博@从流域到海域

  • 相关阅读:
    css垂直居中如何实现
    MUI顶部导航布局
    MUI底部导航栏切换效果
    Jsonp跨域问题
    【已解决】项目加载失败,Web应用程序项目XX已配置为使用IIS
    获取网站绝对路径
    css图片上加文字
    c#界面卡死处理方法
    BeginInvoke异步线程
    menustrip选项怎么设置竖向分割线
  • 原文地址:https://www.cnblogs.com/wanghongze95/p/13842648.html
Copyright © 2011-2022 走看看