📅  最后修改于: 2023-12-03 15:06:45.467000             🧑  作者: Mango
在这个练习中,我们将学习如何使用C语言编写一个菜单驱动程序,该程序用于管理整数BST的基本操作,包括插入、删除、查找和遍历。
BST是一种二叉树数据结构,其中每个节点的左子树都小于该节点的值,而每个节点的右子树都大于等于该节点的值。由于这种特性,BST非常适合用于排序和搜索问题。
这个菜单驱动程序将允许用户选择要执行的操作,包括:
我们将使用C语言编写菜单驱动程序,该程序将使用以下数据结构:
struct Node {
int data;
struct Node *left, *right;
};
该数据结构表示BST的节点,其中 data
是节点的整数值,left
和 right
分别是指向左子树和右子树的指针。
此外,我们将定义以下函数,用于执行操作:
// 创建一个新的节点
struct Node* newNode(int data);
// 在BST中插入一个节点
struct Node* insert(struct Node* node, int data);
// 在BST中删除一个节点
struct Node* deleteNode(struct Node* root, int key);
// 在BST中查找一个节点
struct Node* search(struct Node* root, int key);
// 先序遍历BST
void preOrderTraversal(struct Node* root);
// 中序遍历BST
void inOrderTraversal(struct Node* root);
// 后序遍历BST
void postOrderTraversal(struct Node* root);
我们将使用以上函数实现程序的不同操作。
完整的程序实现如下所示:
#include <stdio.h>
#include <stdlib.h>
// 创建节点的结构
struct Node {
int data;
struct Node *left, *right;
};
// 创建一个新的节点
struct Node* newNode(int data) {
struct Node* node = (struct Node*) malloc(sizeof(struct Node));
node->data = data;
node->left = node->right = NULL;
return node;
}
// 在BST中插入一个节点
struct Node* insert(struct Node* node, int data) {
if (node == NULL) return newNode(data);
if (data < node->data) node->left = insert(node->left, data);
else if (data > node->data) node->right = insert(node->right, data);
return node;
}
// 在BST中查找一个节点
struct Node* search(struct Node* root, int key) {
if (root == NULL || root->data == key) return root;
if (root->data < key) return search(root->right, key);
return search(root->left, key);
}
// 获取BST中的最小节点
struct Node* minValueNode(struct Node* node) {
struct Node* current = node;
while (current->left != NULL) current = current->left;
return current;
}
// 在BST中删除一个节点
struct Node* deleteNode(struct 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 {
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;
}
struct Node* temp = minValueNode(root->right);
root->data = temp->data;
root->right = deleteNode(root->right, temp->data);
}
return root;
}
// 先序遍历BST
void preOrderTraversal(struct Node* root) {
if (root != NULL) {
printf("%d ", root->data);
preOrderTraversal(root->left);
preOrderTraversal(root->right);
}
}
// 中序遍历BST
void inOrderTraversal(struct Node* root) {
if (root != NULL) {
inOrderTraversal(root->left);
printf("%d ", root->data);
inOrderTraversal(root->right);
}
}
// 后序遍历BST
void postOrderTraversal(struct Node* root) {
if (root != NULL) {
postOrderTraversal(root->left);
postOrderTraversal(root->right);
printf("%d ", root->data);
}
}
// 释放BST的内存
void freeBST(struct Node* root) {
if (root != NULL) {
freeBST(root->left);
freeBST(root->right);
free(root);
}
}
int main() {
struct Node* root = NULL;
int choice = 0, data;
while (choice != 7) {
printf("\n\n1. 插入一个整数\n");
printf("2. 删除一个整数\n");
printf("3. 查找一个整数\n");
printf("4. 先序遍历整数BST\n");
printf("5. 中序遍历整数BST\n");
printf("6. 后序遍历整数BST\n");
printf("7. 退出程序\n");
printf("\n请做出您的选择: ");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("\n请输入要插入的整数: ");
scanf("%d", &data);
root = insert(root, data);
break;
case 2:
printf("\n请输入要删除的整数: ");
scanf("%d", &data);
root = deleteNode(root, data);
break;
case 3:
printf("\n请输入要查找的整数: ");
scanf("%d", &data);
if (search(root, data) == NULL) printf("\n整数 %d 未找到", data);
else printf("\n整数 %d 查找成功", data);
break;
case 4:
printf("\n前序遍历整数BST: ");
preOrderTraversal(root);
break;
case 5:
printf("\n中序遍历整数BST: ");
inOrderTraversal(root);
break;
case 6:
printf("\n后序遍历整数BST: ");
postOrderTraversal(root);
break;
case 7:
printf("\n程序已退出");
freeBST(root);
break;
default:
printf("\n无效的选择,请再试一次");
break;
}
}
return 0;
}
使用C编程可以很容易地实现针对整数BST的菜单驱动程序。该程序演示了如何实现基本功能,包括插入、删除、查找和遍历节点。我们还演示了如何动态分配和释放内存,以确保程序不会泄漏内存。为了更好地理解代码,建议对每个函数和数据结构的功能进行评估。