📜  使用 C 编程设计、开发和实现一个菜单驱动程序,用于对整数的二叉搜索树 (BST) 进行以下操作. (1)

📅  最后修改于: 2023-12-03 15:06:45.467000             🧑  作者: Mango

用 C 编程设计、开发和实现一个菜单驱动程序,用于对整数的二叉搜索树(BST)进行以下操作。

介绍

在这个练习中,我们将学习如何使用C语言编写一个菜单驱动程序,该程序用于管理整数BST的基本操作,包括插入、删除、查找和遍历。

BST是一种二叉树数据结构,其中每个节点的左子树都小于该节点的值,而每个节点的右子树都大于等于该节点的值。由于这种特性,BST非常适合用于排序和搜索问题。

程序功能

这个菜单驱动程序将允许用户选择要执行的操作,包括:

  1. 插入一个整数
  2. 删除一个整数
  3. 查找一个整数
  4. 先序遍历整数BST
  5. 中序遍历整数BST
  6. 后序遍历整数BST
  7. 退出程序
程序实现

我们将使用C语言编写菜单驱动程序,该程序将使用以下数据结构:

struct Node {
    int data;
    struct Node *left, *right;
};

该数据结构表示BST的节点,其中 data 是节点的整数值,leftright 分别是指向左子树和右子树的指针。

此外,我们将定义以下函数,用于执行操作:

// 创建一个新的节点
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的菜单驱动程序。该程序演示了如何实现基本功能,包括插入、删除、查找和遍历节点。我们还演示了如何动态分配和释放内存,以确保程序不会泄漏内存。为了更好地理解代码,建议对每个函数和数据结构的功能进行评估。