博客
关于我
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/

    你可能感兴趣的文章
    openlayers 入门教程(八):Geoms 篇
    查看>>
    openlayers 入门教程(六):controls 篇
    查看>>
    openlayers 入门教程(十一):Formats 篇
    查看>>
    openlayers 入门教程(十三):动画
    查看>>
    openlayers 入门教程(十二):定位与轨迹
    查看>>
    openlayers 入门教程(十五):与 canvas、echart,turf 等交互
    查看>>
    openlayers 入门教程(十四):第三方插件
    查看>>
    openlayers 入门教程(四):layers 篇
    查看>>
    OpenLayers 项目分析(三)-OpenLayers中定制JavaScript内置类
    查看>>
    Openlayers下载与加载geoserver的wms服务显示地图
    查看>>
    Openlayers中使用Cluster+Overlay实现点击单个要素和聚合要素时显示不同弹窗
    查看>>
    Openlayers中使用Cluster实现点位元素重合时动态聚合与取消聚合
    查看>>
    Openlayers中使用Cluster实现缩放地图时图层聚合与取消聚合
    查看>>
    Openlayers中使用Image的rotation实现车辆定位导航带转角(判断车辆图片旋转角度)
    查看>>
    Openlayers中使用Overlay实现点击要素弹窗并且弹窗随之移动
    查看>>
    Vmware系列&虚拟机系列【仅供参考】:使用vCenter Auto Deploy制作ESXI系统封装(适合高版本vSphere)
    查看>>
    Openlayers中加载GeoJson文件显示地图
    查看>>
    Openlayers中加载Geoserver切割的EPSG:900913离线瓦片图层组
    查看>>
    Openlayers中加载Geoserver切割的EPSG:900913离线瓦片地图并显示
    查看>>
    Openlayers中多图层遮挡时调整图层上下顺序
    查看>>