在学习数据结构时,二叉搜索树(Binary Search Tree, 简称 BST)是一个非常重要的概念。它支持高效的查找、插入和删除操作。其中,C语言二叉搜索树删除操作是最具挑战性的部分之一。本文将手把手教你如何用 C 语言实现 BST 的删除功能,即使你是编程小白,也能轻松理解!
二叉搜索树是一种特殊的二叉树,它满足以下性质:

删除一个节点时,根据该节点的子节点数量,可分为以下三种情况:
下面是一个完整的 C 语言实现,包含节点定义、插入、查找最小值以及删除操作。
#include <stdio.h>#include <stdlib.h>// 定义二叉搜索树节点结构typedef struct Node { int data; struct Node* left; struct Node* right;} Node;// 创建新节点Node* createNode(int value) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = value; newNode->left = NULL; newNode->right = NULL; return newNode;}// 插入节点(用于构建BST)Node* insert(Node* root, int value) { if (root == NULL) { return createNode(value); } if (value < root->data) { root->left = insert(root->left, value); } else if (value > root->data) { root->right = insert(root->right, value); } return root;}// 查找最小值节点(用于删除有两个子节点的情况)Node* findMin(Node* root) { while (root && root->left != NULL) { root = root->left; } return root;}// 删除节点函数Node* deleteNode(Node* root, int key) { // 基本情况:树为空 if (root == NULL) { return root; } // 递归查找要删除的节点 if (key < root->data) { root->left = deleteNode(root->left, key); } else if (key > root->data) { root->right = deleteNode(root->right, key); } else { // 找到要删除的节点 // 情况1:叶子节点 或 只有一个子节点 if (root->left == NULL) { Node* temp = root->right; free(root); return temp; } else if (root->right == NULL) { Node* temp = root->left; free(root); return temp; } // 情况2:有两个子节点 Node* temp = findMin(root->right); // 找中序后继 root->data = temp->data; // 替换值 root->right = deleteNode(root->right, temp->data); // 删除后继节点 } return root;}// 中序遍历(用于验证结果)void inorder(Node* root) { if (root != NULL) { inorder(root->left); printf("%d ", root->data); inorder(root->right); }}// 主函数测试int main() { Node* root = NULL; root = insert(root, 50); insert(root, 30); insert(root, 20); insert(root, 40); insert(root, 70); insert(root, 60); insert(root, 80); printf("初始中序遍历: "); inorder(root); printf("\n"); root = deleteNode(root, 20); // 删除叶子节点 printf("删除20后: "); inorder(root); printf("\n"); root = deleteNode(root, 30); // 删除有两个子节点的节点 printf("删除30后: "); inorder(root); printf("\n"); return 0;}
- 在C语言BST删除操作中,处理两个子节点的情况最容易出错。记住:我们不是直接删除该节点,而是用它的中序后继(或前驱)的值覆盖它,再删除那个后继节点。
- findMin 函数用于在右子树中找到最小值,即中序后继。
- 删除后一定要释放内存(free),避免内存泄漏。
通过本教程,你已经掌握了 二叉搜索树节点删除 的完整逻辑和 C 语言实现。这是 C语言数据结构教程 中的核心内容之一。多加练习,你就能熟练运用 BST 进行各种操作了!
如果你觉得这篇文章对你有帮助,欢迎收藏并分享给其他正在学习数据结构的朋友!
本文由主机测评网于2025-12-18发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025129337.html