二叉搜索树

来源:互联网 发布:决战武林羽扇6升7数据 编辑:程序博客网 时间:2024/06/07 16:38

二叉搜索树是这样来的





节点是这样删的



//BST.h

#ifndef  _BST_H_#define  _BST_H_/* *在二叉排序树中,当根的左右子树存在时,其左子树上所有节点的值均小于根节点的值,右子树上所有节点的值均大于根节点的值 */#include <stdlib.h>#include <stdio.h>#include <stdbool.h>typedef int Elemenet;typedef  struct _BST_Node{    Elemenet data;    struct _BST_Node  *LChild;    struct _BST_Node  *RChild;}BST_Node;typedef BST_Node *BST;//初始化搜索树void InitBST(BST *bst);//插入bool InsertBST(BST *bst, Elemenet v);//最小节点值Elemenet MinBST(const BST *bst);//最大节点值Elemenet MaxBST(const BST *bst);//中序遍历(值由小到大)void TraversalBST(const BST *bst);//查找BST_Node *SearchBST(const BST *bst, Elemenet key);//删除bool DeleteBST(BST *bst, Elemenet key);//摧毁void DestroyBST(BST *bst);#endif //_BST_H_



//BST.c

#include "BST.h"void InitBST(BST *bst){    *bst = NULL;}//多个if( x ) return; return;的效率和if( x ){} else if( x )...else是一样的,判断次数一致,汇编代码也一样,貌似此处用后者逻辑更清楚些???bool InsertBST(BST *bst, Elemenet v){    if( NULL == *bst )    {        *bst = (BST_Node *)malloc(sizeof(BST_Node));        if( NULL == *bst )            return false;        (*bst)->data = v;        (*bst)->LChild = NULL;        (*bst)->RChild = NULL;        return true;    }    else if( v < (*bst)->data )        return InsertBST(&(*bst)->LChild, v);    else if( v > (*bst)->data )        return  InsertBST(&(*bst)->RChild, v);    else        return false;                           //此种情况下,二叉搜索树中某个节点的值与待插值相等,为保证二叉树节点值的唯一性返回false}//如果左子树存在,那么最小节点应该在左子树上Elemenet MinBST(const BST *bst){    BST_Node *p = *bst;    while (NULL != p->LChild)        p = p->LChild;    return p->data;}//如果右子树存在,最大节点应该在右子树上Elemenet MaxBST(const BST *bst){    BST_Node *p = *bst;    while (NULL != p->RChild)        p = p->RChild;    return p->data;}//中序遍历(值由小到大)void TraversalBST(const BST *bst){    if( NULL == *bst )        return ;    TraversalBST(&(*bst)->LChild);    printf("%d ", (*bst)->data);    TraversalBST(&(*bst)->RChild);}BST_Node *SearchBST(const BST *bst, Elemenet key){    if( NULL == *bst )        return NULL;    if( key < (*bst)->data )        return SearchBST(&(*bst)->LChild, key);    if( key > (*bst)->data )        return SearchBST(&(*bst)->RChild, key);    return *bst;}//多个if( x ) return; return;的效率和if( x ){} else if( x )...else是一样的,判断次数一致,汇编代码也一样bool DeleteBST(BST *bst, Elemenet key){    if( NULL == *bst )        return false;    if( key < (*bst)->data )        return DeleteBST(&(*bst)->LChild, key);    if( key > (*bst)->data )        return DeleteBST(&(*bst)->RChild, key);    //下面为找到目标删除节点的情况    BST_Node *p = NULL;    //目标删除节点的左右子树都存在(如节点59、32、68),可用左子树中的最大者或右子树中最小者的值替换目标删除节点,接着转化为删除左子树中的最大者或右子树中最小者    if( NULL != (*bst)->LChild && NULL != (*bst)->RChild )    {        p = (*bst)->RChild;        while (NULL != p->LChild)                           //寻找右子树中最小者            p = p->LChild;        (*bst)->data = p->data;                             //替换待目标删除节点        return DeleteBST(&(*bst)->RChild, key);             //转化为删除右子树中最小者    }    else                                                    //目标删除节点最多只有一个子树(如2、52、60、69以及全部叶子节点)    {        p = *bst;        if( NULL == (*bst)->LChild )                        //左子树为空(包含左子树为空,右子树不为空与左右子树均为空的情况)        {            *bst = (*bst)->RChild;                          //使指向目标删除节点的指针指向其可能存在的子树或空        }        else                                                //左子树不为空,右子树为空        {            *bst = (*bst)->LChild;                          //指向存在的右子树        }        free(p);        return true;    }}void DestroyBST(BST *bst){    if( NULL == *bst )        return;    DestroyBST(&(*bst)->LChild);    DestroyBST(&(*bst)->RChild);    free(*bst);    *bst = NULL;}



//main.c

#include <stdio.h>#include "BST.h"#include <stdbool.h>int main(int argc, char *argv[]){    BST bst;    int array[10] = {59, 32, 68, 52, 60, 2, 69, 258, 17, 47};    int i = 0;    bool ret = true;    InitBST(&bst);    for(i = 0; i < 10 && ret; i++)    {        ret = InsertBST(&bst, array[i]);    }    printf("最小值为%d\n", MinBST(&bst));    printf("最大值为%d\n", MaxBST(&bst));    printf("遍历\n");    TraversalBST(&bst);    printf("\n");    BST_Node *p = SearchBST(&bst, 258);    if( NULL != p )        printf("查找的节点的值为%d\n", p->data);    else        printf("查找的节点不存在\n");    printf("删除59\n");    DeleteBST(&bst, 59);    printf("遍历\n");    TraversalBST(&bst);    printf("\n删除69\n");    DeleteBST(&bst, 69);    printf("遍历\n");    TraversalBST(&bst);    DestroyBST(&bst);    return 0;}




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电脑桌面上文档剪切了怎么办 苹果官网查不到保修日期怎么办 吃了发霉的花生怎么办 鸡吃大蒜多了怎么办 玖瑰花叶子黄怎么办 羊偷吃腥油和花生饼吃多了怎么办 肉牛眼睛有点变黄少吃东西怎么办 黑坑草鱼不开口怎么办 花生和瓜子受潮皮了怎么办? 菜叶上长了腻虫怎么办 磨辊耐磨层脱落怎么办 磨辊耐磨层小块脱落怎么办 密封胶皮圈松了怎么办 汽筒里胶皮垫密封不严怎么办 磁耦气缸脱磁了怎么办 无杆气缸行程大怎么办 c4d中模型变成线怎么办 内径槽异性需要车一刀怎么办 轴承太紧影响转速怎么办 电动车前轮蝶刹抱死怎么办 摩托三轮车油刹抱死怎么办 手动档汽车离合抱死怎么办 别克gl8后轮吃胎怎么办 扭力梁后轮吃胎怎么办 非独立悬挂吃胎怎么办 货车半轴法兰盘裂纹怎么办 小天才平板裂屏了怎么办 新车撞了个坑怎么办 新车碰了个坑怎么办 汽车顶被砸了个坑怎么办 途观l前减震异响怎么办 锦明8代声音太大怎么办 手机网页无法加载插件怎么办 微信公众号被投诉怎么办 住了酒店的尾房怎么办 喜欢前任的闺蜜怎么办 闺蜜给介绍对象怎么办 喜欢对象的发小怎么办 山东省直医保卡丢失怎么办 高铁票如果错过了怎么办 动车错过了时间怎么办