二叉查找树C语言实现
时间: 2024-11-22 14:19:15 浏览: 33
二叉查找树(Binary Search Tree,BST)是一种常见的数据结构,它的每个节点包含一个键值,且满足左子树的所有节点的键都小于根节点的键,右子树的所有节点的键都大于根节点的键。这里是一个简单的C语言实现示例:
```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;
}
// 插入节点
Node* insertNode(Node* root, int value) {
if (root == NULL) {
return createNode(value);
}
if (value < root->data)
root->left = insertNode(root->left, value);
else if (value > root->data)
root->right = insertNode(root->right, value);
return root;
}
// 查找节点
Node* searchNode(Node* root, int value) {
if (root == NULL || root->data == value)
return root;
if (value < root->data)
return searchNode(root->left, value);
else
return searchNode(root->right, value);
}
// 删除节点(仅演示删除最简单情况,实际中要考虑更多复杂场景)
void deleteNode(Node** root, int value) {
if (*root == NULL)
return;
if (value < (*root)->data)
(*root)->left = deleteNode(&(*root)->left, value);
else if (value > (*root)->data)
(*root)->right = deleteNode(&(*root)->right, value);
else { // 找到了目标节点
// 这里只处理只有一个子节点的情况,其他情况需额外处理
if ((*root)->left == NULL) {
Node* temp = (*root)->right;
free(*root);
*root = temp;
} else if ((*root)->right == NULL) {
Node* temp = (*root)->left;
free(*root);
*root = temp;
} else {
// 找到最小值替换当前节点
Node* temp = findMin((*root)->right);
(*root)->data = temp->data;
deleteNode(&(*root)->right, temp->data);
}
}
}
// 其他辅助函数,如找到最小值的节点
Node* findMin(Node* node) {
while (node->left != NULL)
node = node->left;
return node;
}
int main() {
Node* root = NULL;
root = insertNode(root, 50);
insertNode(root, 30);
insertNode(root, 20);
insertNode(root, 40);
insertNode(root, 70);
insertNode(root, 60);
insertNode(root, 80);
printf("搜索元素40,结果:");
Node* result = searchNode(root, 40);
if (result)
printf("%d found\n", result->data);
else
printf("not found\n");
return 0;
}
```
这个例子中展示了创建、插入、查找和删除节点的基本操作。请注意,在实际项目中,还需要考虑处理节点不存在、删除节点有多个子节点等情况。另外,对于性能敏感的应用,可能需要实现平衡二叉查找树(如AVL树或红黑树)。
阅读全文