一波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++指针小结攻略如下: C/C++指针小结 1. 指针基础 指针是C/C++中一种重要的数据类型,它是用来存储变量地址的变量。 定义指针变量的方式为 类型名* 变量名,例如: int* ptr; // 定义一个指向整型变量的指针 获取变量地址的方式为 &变量名,例如: int a = 10; int* ptr = &a; //…

    C 2023年5月22日
    00
  • 全民小镇2014万圣节活动介绍 全民小镇万圣节特殊海域和兑换券一览

    全民小镇2014万圣节活动介绍 活动时间 2014年10月25日-11月2日 活动内容 全民小镇万圣节活动分为两部分:特殊海域和兑换券。 特殊海域 特殊海域是活动期间新增的一些地图。在这些地图中,您将会遇到一些特殊的怪物和道具,同时还有不同于平常的地图场景,非常适合体验万圣节气氛。 兑换券 兑换券是您在活动中可以获得的奖励之一。在特定的NPC处,您可以用兑换…

    C 2023年5月22日
    00
  • C语言实现投票系统

    C语言实现投票系统攻略 本文将介绍如何使用C语言实现一个简单的投票系统,通过本教程您将学到如下内容:1. 如何使用C语言创建一个控制台程序;2. 如何定义结构体,并对其进行增删改查操作;3. 如何进行用户输入并根据不同的选项实现不同的功能;4. 如何进行文件读写,实现数据的持久化存储。 1. 创建C语言控制台程序 在使用C语言创建控制台程序之前,需要先安装相…

    C 2023年5月23日
    00
  • 自己实现strcpy函数的实现方法

    下面我为你详细介绍一下“自己实现strcpy函数的实现方法”的完整攻略。 1. 了解strcpy函数的作用 在自己实现strcpy函数之前,我们先要了解一下strcpy函数的原理和作用。strcpy函数的作用是将一个字符串复制到另一个字符串中。最常见的使用方式是将一个字符数组复制到另一个字符数组中。 2. 自己实现strcpy函数的方法 现在我们已经了解了s…

    C 2023年5月23日
    00
  • 基于C语言实现简单的扫雷小游戏

    基于C语言实现简单的扫雷小游戏攻略 思路 创建扫雷游戏棋盘 随机初始化地雷位置 统计每个格子周围地雷个数 打开格子、标记地雷 判断游戏是否结束 具体步骤 1. 创建扫雷游戏棋盘 此处使用一个二维数组来模拟一个扫雷棋盘。数组大小需要根据游戏难度来确定,通常为 $10 * 10$、 $16 * 16$ 或 $30 * 30$ 等。 #define ROW 10 …

    C 2023年5月23日
    00
  • C语言超全面define预处理指令的使用说明

    下面是“C语言超全面define预处理指令的使用说明”的完整攻略。 什么是define预处理指令 在C语言中,define是预处理指令之一,用于定义宏。 定义一个宏可以简化代码,使代码更易于阅读和维护。宏可以代替复杂的代码,让程序员在撰写代码时省去重复劳动。 如何使用define预处理指令 定义常量 可以使用define定义一个常量,如下面的代码: #def…

    C 2023年5月23日
    00
  • Objective-C关键字@property使用原理探究

    Objective-C关键字@property使用原理探究 @property的作用 @property是Objective-C中的关键字,用于声明类的属性(property)。使用@property可以快速地生成访问该属性的getter和setter方法的实现代码。 例如,在一个类中声明一个属性name: @property (nonatomic, cop…

    C 2023年5月22日
    00
  • 基于C语言实现随机点名器(附源码)

    基于C语言实现随机点名器(附源码)攻略 背景 在日常教学过程中,老师需要选择学生进行点名,但是传统的手工点名有些麻烦,而电子化的随机点名器则可以快速、方便地进行点名,提高了点名的效率。 组件 点名器的组成部分为三个部分:1. 学生名单(可采用文本文件实现存储);2. 随机数生成器(用于随机产生学生编号);3. 点名器(根据随机数生成器产生的随机数来选出学生进…

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