二叉排序树的查找(插入、删除)

来源:互联网 发布:国家数据统计局官网 编辑:程序博客网 时间:2024/05/22 18:23

二叉排序树的查找(插入、删除)

近期逐步开始期末复习,在博客上投入的精力将大幅减少大概一月左右!

/*二叉树的二叉链表结点结构定义*/typedef struct BiTNode{             //结点结构    int data;                       //结点数据    struct BiTNode *lchild, *rchild;//左右孩子指针}BiTNode, *BiTree;/*递归查找二叉排序树T中是否存在key,指针f指向T的双亲,其初始调用值位NULL,若查找成功,则指针p指向该数据元素结点,并返回TRUE;否则,指针p指向查找路径上访问过的最后一个结点,并返回FALSE*/Status SearchBST(BiTree T, int key, BiTree f, BiTree *p){    if (!T){                        //若查找不成功        *p = f;        return FALSE;    }    else if (key == T->data){       //查找成功        *p = T;        return TRUE;    }    else if (key < T->data)         //若key小于当前data值,则在左子树中继续寻找        return SearchBST(T->lchild, key, T, p);    else                            //若key大于当前data值,则在右子树中继续寻找        return SearchBST(T->rchild, key, T, p);}/*当二叉排序树T中不存在关键字等于key的数据元素时,插入key并返回TRUE,否则返回FALSE*/Status InsertBST(BiTree *T, int key){    BiTree p, s;    if (!SearchBST(*T, key, NULL, &p)){     //查找不成功时,进行插入操作        s = (BiTree)malloc(sizeof(BiTNode));        s->data = key;        s->lchild = NULL;        s->rchild = NULL;        if (!p)            *T = s;                     //插入s为新的根结点        else if (key < p->data)            p->lchild = s;              //插入s为左结点        else            p->rchild = s;              //插入s为右结点        return TRUE;    }    else        return FALSE;                   //树中已有关键字相同的结点,不需要插入}/*若二叉排序树T中存在关键字等于key的数据元素时,删除该数据元素结点,并返回TRUE;否则返回FALSE*/Status DeleteBST(BiTree *T, int key){    if (!*T)return FALSE;       //若树不存在    else{        if (key == (*T)->data)return Delete(T);        else if (key < (*T)->data)            return DeleteBST(&(*T)->lchild, key);        else            return DeleteBST(&(*T)->rchild, key);    }}Status Delete(BiTree *p){    BiTree q, s;    if ((*p)->rchild == NULL){      //右子树空则只需重接它的左子树        q = *p;        *p = (*p)->lchild;        free(q);    }else if ((*p)->lchild == NULL){//左子树空则只需重接它的右子树        q = *p;        *p = (*p)->rchild;        free(q);    }else{                          //左右孩子均不空        q = *p;        s = (*p)->lchild;        while (s->rchild){          //转左,然后向右到尽头            q = s;            s = s->rchild;        }        (*p)->data = s->data;       //s指向被删结点的直接前驱        if (q != *p)            q->rchild = s->lchild;  //重接q的右子树        else            q->lchild = s->lchild;  //重接q的左子树        free(s);    }    return TRUE;}
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 搜门面网 二手店铺 转让饭店 找门面房 搜门面 找门面技巧跳过转让费 北京门面房出租 北京租平房 成都门面价格 底商出售 转让门面 重庆门面出售 买店铺 旺铺网 北京门面出租 深圳美发店转让 北京底商出租 二手门面出售 深圳药店转让 天津小门面出租 武汉门面出售 北京店铺转让 深圳旺铺转让 北京平房出租信息 门面出售信息 天津门面房出租 租铺客 上海转让店铺 店铺转让信息怎么写 门面房价格 无锡门面房出租 铺位转让 店铺转让发布 铺位 店铺转让中介靠谱吗 无锡门面出售 店面门面设计 店面网 店铺出售 门市出售 附近门面出租