C语言实现二叉查找树详解

点击蓝字

e299121f64442ff5fbcc1198863ebd55.png

关注我们

因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享

来源于网络,侵删

二叉查找树(Binary Search Tree,BST)是一种常用的二叉树,它的每个结点最多有两个子结点,且左子结点的值小于父结点的值,右子结点的值大于父结点的值。BST的主要特点是可以在O(log n)的时间内查找、插入和删除元素。

C语言可以通过定义一个结构体来表示BST的结点,例如:

struct node {
    int val;            // 存储结点的值
    struct node *left;  // 指向左子结点的指针
    struct node *right; // 指向右子结点的指针
};

对于BST的插入操作,可以定义一个递归函数来实现:

struct node *insert(struct node *root, int val) {
    if (root == NULL) { // 如果树为空,创建一个新的结点
        struct node *new_node = (struct node *)malloc(sizeof(struct node));
        new_node->val = val;
        new_node->left = new_node->right = NULL;
        return new_node;
    }
    if (val < root->val) // 如果插入的值比当前结点小,插入到左子树中
        root->left = insert(root->left, val);
    else if (val > root->val) // 如果插入的值比当前结点大,插入到右子树中
        root->right = insert(root->right, val);
    return root;
}

对于BST的查找操作,同样可以定义一个递归函数来实现:

struct node *search(struct node *root, int val) {
    if (root == NULL || root->val == val) // 如果找到了结点或者树为空,则返回根结点
        return root;
    if (val < root->val) // 如果要查找的值比当前结点的值小,查找左子树
        return search(root->left, val);
    else // 否则查找右子树
        return search(root->right, val);
}

对于BST的删除操作,需要考虑三种情况:

  1. 要删除的结点为叶子结点,直接删除即可。

  2. 要删除的结点只有一个子节点,将子节点提上来代替要删除的结点。

  3. 要删除的结点有两个子节点,需要找到其右子树的最小值结点替换要删除的结点,再删除右子树的最小值结点。

struct node *delete(struct node *root, int val) {
    if (root == NULL) // 如果根节点为空,直接返回
        return root;
    if (val < root->val) // 如果要删除的值比当前结点的值小,在左子树中继续查找
        root->left = delete(root->left, val);
    else if (val > root->val) // 如果要删除的值比当前结点的值大,在右子树中继续查找
        root->right = delete(root->right, val);
    else {
        if (root->left == NULL) { // 如果要删除的结点只有右子节点或没有子节点,直接删除
            struct node *temp = root->right;
            free(root);
            return temp;
        } else if (root->right == NULL) { // 如果要删除的结点只有左子节点,直接删除
            struct node *temp = root->left;
            free(root);
            return temp;
        } else { // 如果要删除的结点有两个子节点,找到其右子树的最小值结点替换要删除的结点,再删除右子树的最小值结点
            struct node *temp = find_min(root->right);
            root->val = temp->val;
            root->right = delete(root->right, temp->val);
        }
    }
    return root;
}

struct node *find_min(struct node *root) {
    while (root->left != NULL)
        root = root->left;
    return root;
}
 
 
 
 

12e4681499b8b307a76462f472156948.gif

如果你年满18周岁以上,又觉得学【C语言】太难?想尝试其他编程语言,那么我推荐你学Python,现有价值499元Python零基础课程限时免费领取,限10个名额!
▲扫描二维码-免费领取

推荐阅读

C语言史上最愚蠢的BUG

Linux C/C++或者嵌入式开发到底有没有35岁危机?

超级炫酷的C语言技巧!

超硬核C++BestPractices翻译与阅读笔记

点击 阅读原文 了解更多

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值