一波C语言二元查找树算法题目解答实例汇总

一波C语言二元查找树算法题目解答实例汇总

什么是二元查找树?

二元查找树,又称为二叉搜索树,是一种非常常见的数据结构,它的主要特点是左子树所有节点的值小于其根节点的值,右子树所有节点的值大于其根节点的值。该策略保证整个树的左子树所有节点小于根节点,右子树所有节点大于根节点。

二元查找树可以用来做很多问题,例如查找、插入、删除等。

二元查找树算法题目解答实例汇总

下面我们将对几个常见的二元查找树算法题目进行讲解。

题目一: 向二元查找树中插入节点

实现一个函数,将一个整数插入到二元查找树中。

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
};

struct TreeNode* insertIntoBST(struct TreeNode* root, int val){
    if (root == NULL) {
        root = malloc(sizeof(struct TreeNode));
        root->val = val;
        root->left = NULL;
        root->right = NULL;
    } else {
        if (root->val < val) {
            root->right = insertIntoBST(root->right, val);
        } else if (root->val > val) {
            root->left = insertIntoBST(root->left, val);
        } else {
            // do nothing
        }
    }
    return root;
}

以上代码通过递归将值插入二元查找树中。如果根节点为空,则新建一个根节点并返回;如果插入的值小于根节点,则继续递归左子树;如果插入的值大于根节点,则递归右子树。如果插入的值已经存在,则不进行任何操作。

题目二: 在二元查找树中删除节点

实现一个函数,将一个给定的值从二元查找树中删除。如果树中节点数小于等于1,则删除整个树。

struct TreeNode* deleteNode(struct TreeNode* root, int key) {
    if (root == NULL) {
        return NULL;
    }

    if (root->val == key) {
        // 如果是叶子节点,则直接删除
        if (root->left == NULL && root->right == NULL) {
            free(root);
            root = NULL;
        } else if (root->left == NULL) {
            // 如果只有右孩子,则将右孩子上升为新的根节点
            struct TreeNode *tmp = root;
            root = root->right;
            free(tmp);
        } else if (root->right == NULL) {
            // 如果只有左孩子,则将左孩子上升为新的根节点
            struct TreeNode *tmp = root;
            root = root->left;
            free(tmp);
        } else {
            // 如果有两个孩子,则将右子树的最小值作为新的根节点
            struct TreeNode *tmp = root->right;
            while (tmp->left != NULL) {
                tmp = tmp->left;
            }
            root->val = tmp->val;
            root->right = deleteNode(root->right, tmp->val);
        }
    } else if (root->val < key) {
        root->right = deleteNode(root->right, key);
    } else {
        root->left = deleteNode(root->left, key);
    }

    return root;
}

以上代码通过递归将给定值从二元查找树中删除。如果根节点为空,则返回 NULL;如果要删除的值小于根节点,则继续递归左子树;如果要删除的值大于根节点,则递归右子树。如果要删除的值等于根节点,需要考虑以下三种情况:

  • 如果要删除的节点是叶子节点,则直接删除。
  • 如果要删除的节点只有一个孩子,则将该孩子上升为新的根节点。
  • 如果要删除的节点有两个孩子,则将右子树的最小值作为新的根节点。

示例一:向二元查找树中插入节点

例如,将数组 [4,2,7,1,3] 转换成二元查找树,代码如下:

struct TreeNode* root = NULL;
for (int i = 0; i < 5; i++) {
    root = insertIntoBST(root, nums[i]);
}

其中 nums 数组为 [4,2,7,1,3],表示要插入的数。插入后的二元查找树如下所示:

      4
     / \
    2   7
   / \
  1   3

示例二:在二元查找树中删除节点

例如,删除数值为 2 的节点进行重建,代码如下:

root = deleteNode(root, 2);

重建后的二元查找树如下所示:

      4
     / \
    3   7
   /
  1

总结

二元查找树是一种非常有用的数据结构,可以用来解决很多问题。通过上述两个题目的讲解,希望大家能够更加深入的了解二元查找树的相关知识。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一波C语言二元查找树算法题目解答实例汇总 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C++继承的定义与注意事项

    C++继承的定义 C++中的继承是指一个类可以从另一个类中继承属性和行为。被继承的类称为父类或基类,继承的类称为派生类或子类。 在C++中,使用冒号符号来进行继承,语法如下: class 子类名 : 访问修饰符 基类 { //子类的其他内容 }; 其中,访问修饰符可以是public、protected或private,用来决定派生类继承来的基类成员的访问权限…

    C 2023年5月22日
    00
  • c++获取sqlite3数据库表中所有字段的方法小结

    获取SQLite3数据库表中所有字段的方法,可以通过查询系统表信息来获取。具体方法如下: 使用C++代码获取SQLite3数据库表中所有字段的方法小结 1. 打开数据库 要操作SQLite3数据库,首先需要打开它。可以使用sqlite3_open()函数打开数据库,示例代码如下: sqlite3 *db; int rc = sqlite3_open(&quo…

    C 2023年5月22日
    00
  • C语言实现教务管理系统

    C语言实现教务管理系统攻略 什么是教务管理系统? 教务管理系统是用于学校管理各类学生信息、教师信息、考试信息、课程信息等的一款软件。它能够提供方便快捷的教务事务处理,节约时间和劳动力,提高工作效率和精度。 C语言实现教务管理系统的必要性 C是一种高效的、跨平台的编程语言,它在系统开发、游戏开发等领域广泛应用。而在实现教务管理系统这样的软件开发中,C语言具有更…

    C 2023年5月23日
    00
  • Java异常处理实例详解

    Java 异常处理实例详解 什么是异常? 在 Java 中,错误分为两种类型:编译时错误和运行时错误。 编译时错误是指在编译代码期间出现的错误,比如语法错误等。这些错误会在编译时被检查出来,并在编译阶段被修复。 运行时错误是指在执行代码期间发生的错误,比如除以零、访问空指针等。这些错误发生在程序运行时,无法在编译时被检查出来,需要在代码中处理。 Java 中…

    C 2023年5月23日
    00
  • C++中strcpy函数的实现

    C++中的strcpy函数是用于将一个字符串复制到另一个字符串中的函数。其原型为: char *strcpy(char *dest, const char *src); 其中,dest代表目标字符串,src代表源字符串。 以下是strcpy函数的实现过程: 首先判断源字符串和目标字符串是否为 NULL。如果是,则直接返回 NULL。 然后将 src 指针所指…

    C 2023年5月23日
    00
  • 详解约瑟夫环问题及其相关的C语言算法实现

    详解约瑟夫环问题及其相关的C语言算法实现 什么是约瑟夫环问题? 约瑟夫环问题是一个著名的数学问题,也称作是约瑟夫问题。一般来说,问题描述为:有 $n$ 个人围成一圈,从第 $k$ 个人开始报数,每报到第 $m$ 个人,就将该人从圈中杀死,然后从杀死该人的下一个人开始重新报数,直到圈中只剩下一个人为止。求圆圈中最后一个剩下的人的编号。 该问题有多种解法,其中比…

    C 2023年5月22日
    00
  • i9-10920Xc处理器怎么样 i9-10920Xc参数跑分性能评测

    i9-10920Xc处理器简介 i9-10920Xc是英特尔基于其Skylake-X微架构推出的一款高档桌面级处理器,主要面向需要高性能计算的用户,如游戏玩家、影音剪辑者、3D建模者等。i9-10920Xc处理器采用14nm工艺,拥有12个物理核心和24个线程,最高主频可达4.8 GHz。它的主要竞争对手是AMD Ryzen Threadripper 292…

    C 2023年5月23日
    00
  • C++中的vector中erase用法实例代码

    C++中的vector中erase用法实例代码 简介 在C++中,vector是一种非常常用的容器,它可以动态地管理内存,能够随时加入或者删除元素。vector的erase方法是其中非常常用的函数之一,通过该函数我们可以删除vector中的元素。 使用方法 vector中的erase函数有多种使用方法,其中比较常用的有两种,分别是通过迭代器和通过下标。下面将…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部