博客
关于我
C语言实现二叉搜索树
阅读量:243 次
发布时间:2019-03-01

本文共 4872 字,大约阅读时间需要 16 分钟。

二叉搜索树是常见的数据结构,主要用于快速查找数据。以下是对二叉搜索树操作集的实现,包括插入、删除、查找、找最小值和找最大值的函数。

节点结构定义

typedef struct TNode *Position;typedef Position BinTree;struct TNode {    ElementType Data;    BinTree Left;    BinTree Right;};

插入函数

插入函数将一个元素插入二叉搜索树中,并返回根节点指针。

BinTree Insert(BinTree BST, ElementType X) {    if (!BST) {        BST = (BinTree)malloc(sizeof(struct TNode));        BST->Data = X;        BST->Left = NULL;        BST->Right = NULL;    } else {        if (X < BST->Data) {            BST->Left = Insert(BST->Left, X);        } else if (X > BST->Data) {            BST->Right = Insert(BST->Right, X);        }    }    return BST;}

删除函数

删除函数将一个元素从二叉搜索树中删除,并返回根节点指针。如果元素不存在,输出“Not Found”并返回原树根节点。

BinTree Delete(BinTree BST, ElementType X) {    Position Tmp;    if (!BST) {        printf("Not Found\n");        return BST;    } else if (X < BST->Data) {        BST->Left = Delete(BST->Left, X);    } else if (X > BST->Data) {        BST->Right = Delete(BST->Right, X);    } else {        if (BST->Left && BST->Right) {            Tmp = FindMin(BST->Right);            BST->Data = Tmp->Data;            BST->Right = Delete(BST->Right, BST->Data);        } else {            Tmp = BST;            if (!BST->Left) {                BST = BST->Right;            } else if (!BST->Right) {                BST = BST->Left;            }            free(Tmp);        }    }    return BST;}

查找函数

查找函数返回目标值的节点指针,如果不存在则返回空指针。

Position Find(BinTree BST, ElementType X) {    while (BST) {        if (X > BST->Data) {            BST = BST->Right;        } else if (X < BST->Data) {            BST = BST->Left;        } else {            return BST;        }    }    return NULL;}

找最小值函数

找最小值函数返回二叉搜索树中最小值的节点指针。

Position FindMin(BinTree BST) {    while (BST) {        if (!BST->Left) {            return BST;        } else {            BST = BST->Left;        }    }    return NULL;}

找最大值函数

找最大值函数返回二叉搜索树中最大值的节点指针。

Position FindMax(BinTree BST) {    while (BST) {        if (!BST->Right) {            return BST;        } else {            BST = BST->Right;        }    }    return NULL;}

使用示例

#include 
#include
typedef int ElementType;typedef struct TNode *Position;typedef Position BinTree;struct TNode { ElementType Data; BinTree Left; BinTree Right;};BinTree Insert(BinTree BST, ElementType X) { if (!BST) { BST = (BinTree)malloc(sizeof(struct TNode)); BST->Data = X; BST->Left = NULL; BST->Right = NULL; } else { if (X < BST->Data) { BST->Left = Insert(BST->Left, X); } else if (X > BST->Data) { BST->Right = Insert(BST->Right, X); } } return BST;}BinTree Delete(BinTree BST, ElementType X) { Position Tmp; if (!BST) { printf("Not Found\n"); return BST; } else if (X < BST->Data) { BST->Left = Delete(BST->Left, X); } else if (X > BST->Data) { BST->Right = Delete(BST->Right, X); } else { if (BST->Left && BST->Right) { Tmp = FindMin(BST->Right); BST->Data = Tmp->Data; BST->Right = Delete(BST->Right, BST->Data); } else { Tmp = BST; if (!BST->Left) { BST = BST->Right; } else if (!BST->Right) { BST = BST->Left; } free(Tmp); } } return BST;}Position Find(BinTree BST, ElementType X) { while (BST) { if (X > BST->Data) { BST = BST->Right; } else if (X < BST->Data) { BST = BST->Left; } else { return BST; } } return NULL;}Position FindMin(BinTree BST) { while (BST) { if (!BST->Left) { return BST; } else { BST = BST->Left; } } return NULL;}Position FindMax(BinTree BST) { while (BST) { if (!BST->Right) { return BST; } else { BST = BST->Right; } } return NULL;}int main() { BinTree BST, MinP, MaxP, Tmp; ElementType X; int N, i; BST = NULL; scanf("%d", &N); for (i = 0; i < N; i++) { scanf("%d", &X); BST = Insert(BST, X); } printf("preorder: "); preorderTraversal(BST); printf("\n"); MinP = FindMin(BST); MaxP = FindMax(BST); for (i = 0; i < N; i++) { X = ...; Tmp = Find(BST, X); if (Tmp == NULL) { printf("%d is not found\n", X); } else { if (Tmp == MinP) { printf("%d is the smallest key\n", Tmp->Data); } if (Tmp == MaxP) { printf("%d is the largest key\n", Tmp->Data); } } } scanf("%d", &N); for (i = 0; i < N; i++) { X = ...; Tmp = Insert(BST, X); ... } ...}

功能说明

  • 插入函数:递归地将元素插入到正确的位置,确保树的结构。
  • 删除函数:处理三种删除情况,确保树的结构正确性。
  • 查找函数:通过比较节点值,找到目标节点或返回空指针。
  • 找最小值和最大值函数:分别从左下方和右下方遍历,找到叶节点。
  • 这些函数按照二叉搜索树的性质实现,确保插入、删除和查找的效率。

    转载地址:http://gxhv.baihongyu.com/

    你可能感兴趣的文章
    PIPE 接口信号列表
    查看>>
    pipeline配置与管理Job企业级实战
    查看>>
    pipeline项目配置实战
    查看>>
    Pipenv 与 Conda?
    查看>>
    QVGA/HVGA/WVGA/FWVGA分辨率屏含义及大小//Android虚拟机分辨率
    查看>>
    pipreqs : 无法将“pipreqs”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径 正确,然后再试一次。
    查看>>
    pipy国内镜像的网址
    查看>>
    quiver绘制python语言
    查看>>
    pip下载缓慢
    查看>>
    PIP使用SSH从BitBucket安装自定义软件包,无需输入SSH密码
    查看>>
    pip在安装模块时提示Read timed out
    查看>>
    Pix2Pix如何工作?
    查看>>
    QuickBI助你成为分析师——搞定数据源
    查看>>
    pkl来存储python字典
    查看>>
    quick sort | 快速排序 C++ 实现
    查看>>
    pkpmbs 建设工程质量监督系统 文件上传漏洞复现
    查看>>
    pku 2400 Supervisor, Supervisee KM求最小权匹配+DFS回溯解集
    查看>>
    queue队列、deque双端队列和priority_queue优先队列
    查看>>
    PKUSC2018游记
    查看>>
    PK项目测试,做产品测试有这4大优势!
    查看>>