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

    你可能感兴趣的文章
    Prometheus监控redis数据库实战
    查看>>
    Prometheus监控教程:使用Grafana展示主机基本信息
    查看>>
    pytorch中如何使用预训练词向量
    查看>>
    Prometheus监控教程:使用PromQL查询监控数据(上篇)
    查看>>
    Prometheus监控教程:使用PromQL查询监控数据(下篇)
    查看>>
    Pytorch中关于forward函数的理解与用法
    查看>>
    Prometheus监控教程:安装部署
    查看>>
    Prometheus监控教程:配置介绍
    查看>>
    Pytorch中tqdm进度条的使用
    查看>>
    Prometheus(2):SpringBoot 2.X集成Prometheus
    查看>>
    Promise 原理解析与实现(遵循Promise/A+规范)
    查看>>
    PyTorch:传递 numpy 数组进行权重初始化
    查看>>
    PyTorch-Tutorials【pytorch官方教程中英文详解】- 8 Save and Load Model
    查看>>
    promise.all是并发执行吗_攻破面试灵魂拷问,解读Java并发编程的艺术,本文带你深入l理解...
    查看>>
    PyTorch-Tutorials【pytorch官方教程中英文详解】- 7 Optimization
    查看>>
    promise总结
    查看>>
    Propel项目改为基于TensorFlow.js
    查看>>
    PyTorch-Tutorials【pytorch官方教程中英文详解】- 6 Autograd
    查看>>
    properties出现中文乱码解决方法(万能)
    查看>>
    Property 'submit' of object #<HTMLFormElement> is not a function
    查看>>