设计二叉排序树插入、创建、查找和删除算法,并用相关数据进行测试。写一段c语言代码
时间: 2024-02-05 18:05:18 浏览: 80
C语言编写的二叉排序树的插入、删除
4星 · 用户满意度95%
好的,下面是二叉排序树的插入、创建、查找和删除算法的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构体
typedef struct Node {
int value;
struct Node *left;
struct Node *right;
} Node;
// 插入节点
Node *insert(Node *node, int value) {
// 如果根节点为空,则创建一个新节点
if (node == NULL) {
node = (Node *) malloc(sizeof(Node));
node->value = value;
node->left = NULL;
node->right = NULL;
} else {
// 如果待插入的值小于根节点的值,则插入到左子树中
if (value < node->value) {
node->left = insert(node->left, value);
} else {
// 如果待插入的值大于等于根节点的值,则插入到右子树中
node->right = insert(node->right, value);
}
}
return node;
}
// 创建二叉树
Node *createTree(int arr[], int n) {
Node *root = NULL;
for (int i = 0; i < n; i++) {
root = insert(root, arr[i]);
}
return root;
}
// 查找节点
Node *search(Node *node, int value) {
if (node == NULL || node->value == value) {
return node;
}
if (value < node->value) {
return search(node->left, value);
} else {
return search(node->right, value);
}
}
// 删除节点
Node *delete(Node *node, int value) {
if (node == NULL) {
return node;
}
if (value < node->value) {
node->left = delete(node->left, value);
} else if (value > node->value) {
node->right = delete(node->right, value);
} else {
// 如果该节点有零个或一个子节点,则直接删除该节点
if (node->left == NULL) {
Node *temp = node->right;
free(node);
return temp;
} else if (node->right == NULL) {
Node *temp = node->left;
free(node);
return temp;
}
// 如果该节点有两个子节点,则找到右子树中最小的节点替换该节点
Node *temp = node->right;
while (temp->left != NULL) {
temp = temp->left;
}
node->value = temp->value;
node->right = delete(node->right, temp->value);
}
return node;
}
// 中序遍历二叉树
void inorder(Node *node) {
if (node == NULL) {
return;
}
inorder(node->left);
printf("%d ", node->value);
inorder(node->right);
}
int main() {
int arr[] = {5, 3, 7, 2, 4, 6, 8};
int n = sizeof(arr) / sizeof(int);
Node *root = createTree(arr, n);
printf("中序遍历二叉树:");
inorder(root);
printf("\n查找节点 4:");
Node *node4 = search(root, 4);
if (node4) {
printf("找到了,值为 %d\n", node4->value);
} else {
printf("未找到\n");
}
printf("删除节点 5 后,中序遍历二叉树:");
root = delete(root, 5);
inorder(root);
return 0;
}
```
上述代码中,我们定义了一个 `Node` 结构体来表示二叉树的节点,其中包含该节点的值 `value`,以及左子树和右子树的指针 `left` 和 `right`。我们先实现了插入节点的算法,该算法首先检查根节点是否为空,如果是,则创建一个新节点并返回;否则,根据待插入的值与根节点的值的大小关系,递归地在左子树或右子树中插入节点。接着,我们实现了创建二叉树的算法,该算法遍历给定的数组,逐个插入节点,并返回根节点。然后,我们实现了查找节点的算法,该算法首先检查当前节点是否为空或等于待查找的值,如果是,则返回该节点;否则,根据待查找的值与当前节点的值的大小关系,递归地在左子树或右子树中查找节点。最后,我们实现了删除节点的算法,该算法首先检查当前节点是否为空,如果是,则直接返回;否则,根据待删除的值与当前节点的值的大小关系,递归地在左子树或右子树中删除节点。如果该节点有零个或一个子节点,则直接删除该节点;否则,找到右子树中最小的节点替换该节点。最后,我们实现了中序遍历二叉树的算法,并在 `main` 函数中测试了以上算法的正确性。
阅读全文