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

yizhihongxing

一波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 2023年5月23日
    00
  • C++实现二叉树基本操作详解

    C++实现二叉树基本操作详解 二叉树是计算机科学中的重要数据结构,其实现在C++编程中是必不可少的。本文将从二叉树的定义、基本操作的实现以及示例说明三个方面,详细讲解如何在C++中实现二叉树。 一、二叉树的定义 二叉树是一种树形结构,其中每个节点最多只包含两个子节点(左子节点和右子节点)。每个节点都包含一个值(或者说是一个数据项),而左右子节点则分别指向另外…

    C 2023年5月23日
    00
  • VS2019如何添加头文件路径的方法步骤

    首先,在VS2019中添加头文件路径需要进行以下步骤: 打开要添加头文件路径的项目的属性页面。右击项目名称,选择“属性”或者按下快捷键“Alt+Enter”打开属性页面。 在属性页面中,选择“VC++目录”选项卡。 在“包含目录”一栏中,点击右侧的下拉箭头,选择“编辑”或者“”选项。 在弹出的窗口中,点击右侧的“新建文件夹”按钮,然后输入头文件路径所在的文件…

    C 2023年5月23日
    00
  • C++11智能指针之weak_ptr详解

    C++11智能指针之weak_ptr详解 简介 C++11添加了4种智能指针:unique_ptr、shared_ptr、weak_ptr、auto_ptr。其中weak_ptr是一种弱引用类型的指针,它不对所指对象进行引用计数,可以防止 shared_ptr 的循环引用问题。 特点 weak_ptr 所指向的对象可能已经被删除了,因此在使用 weak_pt…

    C 2023年5月22日
    00
  • Spring Cloud Gateway全局通用异常处理的实现

    下面我会提供详细的攻略来讲解 “Spring Cloud Gateway全局通用异常处理的实现”。 前置知识要求 在学习 Spring Cloud Gateway 全局通用异常处理之前,需要先熟悉以下知识: Spring Boot Spring Cloud Gateway 如果搞定了前置知识的要求,那么我们现在来讲解具体的实现。 Spring Cloud G…

    C 2023年5月22日
    00
  • 详解C++编程中的析构函数

    详解C++编程中的析构函数 在C++编程中,类的析构函数是很重要的一部分。它用于在对象的生命周期结束时执行清理工作,比如释放内存或关闭文件。本篇文章将详细讲解C++编程中的析构函数,包括如何定义析构函数、析构函数的执行顺序、析构函数的调用方式以及一些使用析构函数的示例。 定义析构函数 类的析构函数是在对象销毁时自动调用的函数,因此不需要手动调用。析构函数必须…

    C 2023年5月22日
    00
  • 尼尔机械纪元结局如何选 全结局条件图文介绍

    关于尼尔机械纪元结局的选择及全结局条件,我会通过以下几个方面进行详细讲解: 结局种类及选择方法 全结局条件概述 示例说明 1. 结局种类及选择方法 尼尔机械纪元共有5种结局,分别是A B C D E,其中A~D为主结局,E为非正式结局。为了触发每个结局,你需要在游戏中做出不同的选择。以下是各个结局的选择步骤: A结局:完成E机器人的任务,选择消除“人机分离”…

    C 2023年5月22日
    00
  • java 三元操作符用法说明

    Java的三元操作符也称为条件运算符(Ternary Operator),它是Java中唯一的一个三元运算符。它使用“?”和“:”符号,表示一个简单的条件转换操作,它通常用于简化if-else语句的使用。这个操作符的语法格式如下:expression1 ? expression2 : expression3。 其中,expression1为一个布尔表达式或者…

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