📜  字符串的二叉搜索树 - C 编程语言(1)

📅  最后修改于: 2023-12-03 14:53:27.042000             🧑  作者: Mango

字符串的二叉搜索树 - C 编程语言

在C语言中,我们可以使用二叉搜索树(Binary Search Tree,以下简称BST)来存储和管理字符串。二叉搜索树是一种树状的数据结构,它为每个节点指定了一个键值,并将键值存储在树中的相应位置。这使得二叉搜索树可以快速查找、插入和删除键值。

实现BST

以下是一个简单的二叉搜索树的实现:

typedef struct node {
    char* key;
    struct node* left;
    struct node* right;
} node;

node* tree_insert(node* root, const char* key) {
    if (root == NULL) {
        // 如果根节点为空,则创建一个新节点作为根节点
        node* new_node = (node*) malloc(sizeof(node));
        new_node->key = strdup(key);
        new_node->left = NULL;
        new_node->right = NULL;
        return new_node;
    }

    int cmp = strcmp(key, root->key);
    if (cmp < 0) {
        root->left = tree_insert(root->left, key);
    } else if (cmp > 0) {
        root->right = tree_insert(root->right, key);
    }

    return root;
}

上述代码中的 tree_insert() 函数负责将一个字符串插入到二叉搜索树中。如果根节点为空,则创建一个新节点作为根节点;否则,根据键值的大小关系,在二叉搜索树的左子树或右子树中插入新节点。

遍历BST

我们可以使用前序遍历、中序遍历或后序遍历的方式遍历二叉搜索树,以下是一个中序遍历的例子:

void tree_traverse_inorder(node* root) {
    if (root == NULL) {
        return;
    }

    tree_traverse_inorder(root->left);
    printf("%s\n", root->key);
    tree_traverse_inorder(root->right);
}

上述代码中的 tree_traverse_inorder() 函数使用递归方式进行中序遍历,先访问左子树,然后访问根节点,最后访问右子树。

查找BST

以下是一个用于查询BST中指定键值的函数:

node* tree_search(node* root, const char* key) {
    if (root == NULL) {
        return NULL;
    }

    int cmp = strcmp(key, root->key);
    if (cmp == 0) {
        return root;
    } else if (cmp < 0) {
        return tree_search(root->left, key);
    } else {
        return tree_search(root->right, key);
    }
}

上述代码中的 tree_search() 函数用于查找二叉搜索树中的指定键值。如果当前节点的键值等于要查找的键值,则返回该节点;否则,在左子树或右子树中进行递归查找。

删除BST

以下是一个用于删除BST中指定键值的函数:

node* tree_delete(node* root, const char* key) {
    if (root == NULL) {
        return NULL;
    }

    int cmp = strcmp(key, root->key);
    if (cmp < 0) {
        root->left = tree_delete(root->left, key);
    } else if (cmp > 0) {
        root->right = tree_delete(root->right, key);
    } else {
        // 如果要删除的节点没有左子树,则直接返回其右子树
        if (root->left == NULL) {
            node* right_child = root->right;
            free(root->key);
            free(root);
            return right_child;
        }

        // 如果要删除的节点没有右子树,则直接返回其左子树
        if (root->right == NULL) {
            node* left_child = root->left;
            free(root->key);
            free(root);
            return left_child;
        }

        // 如果要删除的节点既有左子树又有右子树,则将其替换为右子树中最小的节点
        node* min_node = tree_find_min(root->right);
        root->key = min_node->key;
        root->right = tree_delete(root->right, min_node->key);
    }

    return root;
}

上述代码中的 tree_delete() 函数用于删除二叉搜索树中的指定键值。如果要删除的节点没有左子树或右子树,则直接删除该节点,并将其子节点连接到该节点的父节点上;如果要删除的节点既有左子树又有右子树,则将其替换为右子树中最小的节点,并再次递归删除该最小节点。

总结

使用二叉搜索树可以快速对字符串进行查找、插入和删除,这对于大规模的字符串处理具有极大的优势。我们可以使用C语言中的指针来实现一个简单的二叉搜索树,同时也可以通过递归等方式实现树的遍历、查找和删除。