909-2015-T2

news2024/11/16 3:42:40

文章目录

  • 1.原题
  • 2.算法思想
  • 3.关键代码
  • 4.完整代码
  • 5.运行结果

1.原题

编写算法,删除二叉搜索树(二叉排序树)的最小元素。叙述算法思想并给出算法实现,分析算法复杂性。二叉树采用链式存储结构,节点结构如下:(图略)其中data表示节点存储的数据,lchild和rchild分别表示指向左子节点的指针和指向右子节点的指针。

2.算法思想

1.是否为空;

2.非空且没有左孩子,说明根结点是最小的;

3.非空有左孩子,找到最左下角,再判断该结点是否有右孩子

3.关键代码

/**
 * @struct treeNode
 * @brief 二叉搜索树节点结构
 */
struct treeNode {
    int data; /**< 节点的数据 */
    struct treeNode *lchild; /**< 左子节点指针 */
    struct treeNode *rchild; /**< 右子节点指针 */
};

/**
 * @brief 删除最小节点
 *
 * 删除二叉搜索树中最小的节点。
 *
 * @param root 二叉搜索树的根节点指针
 * @return struct treeNode* 返回删除最小节点后的根节点指针
 */
struct treeNode *deleteMinNode(struct treeNode *root) {
    struct treeNode *current = root;
    if (root == NULL) {
        printf("This is an empty tree.\n");
        return NULL;
    } else if (root->lchild == NULL) { // 左子树为空,则根为最小结点,删除根,令右孩子为根
        printf("The minimum root is %d.\n", root->data);
        free(current);
        return root->rchild;
    } else {
        struct treeNode *parent;
        while (current->lchild != NULL) { // 找到最左下角的结点
            parent = current;
            current = current->lchild;
        }
        printf("The minimum root is %d.\n", current->data);

        if (current->rchild != NULL) { // 如果有右孩子,则需要把右孩子放到自己的位置上
            parent->lchild = current->rchild;
        } else { // 没有右孩子,删除该结点即可
            parent->lchild = NULL;
            free(current);
        }

        return root;
    }
}

4.完整代码

/**
 * @file binary_search_tree.c
 * @brief 实现了二叉搜索树的创建、插入、遍历、删除最小节点功能。
 */

#include <stdio.h>
#include <stdlib.h>

/**
 * @struct treeNode
 * @brief 二叉搜索树节点结构
 */
struct treeNode {
    int data; /**< 节点的数据 */
    struct treeNode *lchild; /**< 左子节点指针 */
    struct treeNode *rchild; /**< 右子节点指针 */
};

/**
 * @brief 删除最小节点
 *
 * 删除二叉搜索树中最小的节点。
 *
 * @param root 二叉搜索树的根节点指针
 * @return struct treeNode* 返回删除最小节点后的根节点指针
 */
struct treeNode *deleteMinNode(struct treeNode *root) {
    struct treeNode *current = root;
    if (root == NULL) {
        printf("This is an empty tree.\n");
        return NULL;
    } else if (root->lchild == NULL) { // 左子树为空,则根为最小结点,删除根,令右孩子为根
        printf("The minimum root is %d.\n", root->data);
        free(current);
        return root->rchild;
    } else {
        struct treeNode *parent;
        while (current->lchild != NULL) { // 找到最左下角的结点
            parent = current;
            current = current->lchild;
        }
        printf("The minimum root is %d.\n", current->data);

        if (current->rchild != NULL) { // 如果有右孩子,则需要把右孩子放到自己的位置上
            parent->lchild = current->rchild;
        } else { // 没有右孩子,删除该结点即可
            parent->lchild = NULL;
            free(current);
        }

        return root;
    }
}

/**
 * @brief 创建新节点
 *
 * 创建并返回一个新的二叉搜索树节点。
 *
 * @param value 节点值
 * @return struct treeNode* 返回创建的新节点
 */
struct treeNode *createNode(int value) {
    struct treeNode *newNode = (struct treeNode *) malloc(sizeof(struct treeNode));
    newNode->data = value;
    newNode->lchild = NULL;
    newNode->rchild = NULL;
    return newNode;
}

/**
 * @brief 向二叉搜索树中插入节点
 *
 * 向二叉搜索树中插入一个节点。
 *
 * @param node 二叉搜索树的根节点指针
 * @param value 待插入的节点值
 * @return struct treeNode* 返回插入节点后的根节点指针
 */
struct treeNode *insert(struct treeNode *node, int value) {
    if (node == NULL) {
        return createNode(value);
    }

    if (value < node->data) {
        node->lchild = insert(node->lchild, value);
    } else if (value > node->data) {
        node->rchild = insert(node->rchild, value);
    }

    return node;
}

/**
 * @brief 中序遍历打印二叉搜索树节点数据
 *
 * 以中序遍历方式打印二叉搜索树节点数据。
 *
 * @param node 二叉搜索树的根节点指针
 */
void inorderTraversal(struct treeNode *node) {
    if (node != NULL) {
        inorderTraversal(node->lchild);
        printf("%d ", node->data);
        inorderTraversal(node->rchild);
    }
}

/**
 * @brief 使用括号表示法打印二叉搜索树
 *
 * 使用括号表示法打印整个二叉搜索树。
 *
 * @param node 二叉搜索树的根节点指针
 */
void printTreeInParenthesis(struct treeNode *node) {
    if (node == NULL) {
        printf("()"); // 空节点用括号表示
        return;
    }

    printf("(%d", node->data); // 输出节点的值

    // 如果节点有子节点,则进行递归打印
    if (node->lchild != NULL || node->rchild != NULL) {
        printTreeInParenthesis(node->lchild); // 递归打印左子树
        printTreeInParenthesis(node->rchild); // 递归打印右子树
    }

    printf(")"); // 节点的子树打印完毕,打印右括号
}


int main() {
    struct treeNode *root = NULL;
    int elements[] = {5, 3, 8, 2, 4, 7, 9};

    // 插入节点到二叉搜索树
    for (int i = 0; i < sizeof(elements) / sizeof(elements[0]); i++) {
        root = insert(root, elements[i]);
    }

    printf("Inorder traversal of the BST: ");
    inorderTraversal(root); // 打印中序遍历结果

    printf("\nTree in parenthesis notation: ");
    printTreeInParenthesis(root); // 使用括号表示法打印树结构

    for(int i =0;i<sizeof(elements)/ sizeof(elements[0]);i++) {
        root = deleteMinNode(root);
        printf("no.%d,Tree in parenthesis notation: ",i+1);
        printTreeInParenthesis(root); // 使用括号表示法打印树结构
    }

    return 0;
}

5.运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1236455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用逻辑过期解决缓存击穿问题

需求&#xff1a;修改根据id查询商铺的业务&#xff0c;基于逻辑过期方式来解决缓存击穿问题 思路分析&#xff1a;当用户开始查询redis时&#xff0c;判断是否命中&#xff0c;如果没有命中则直接返回空数据&#xff0c;不查询数据库&#xff0c;而一旦命中后&#xff0c;将v…

实验(四):指令部件实验

一、实验内容与目的 实验要求&#xff1a; 利用CP226实验仪上的小键盘将程序输入主存储器EM&#xff0c;通过指令的执行实现微程序控制器的程序控制。 实验目的&#xff1a; 1.掌握模型机的操作码测试过程&#xff1b; 2.掌握模型机微程序控制器的基本结构以及程序控制的基本原…

GDB Debugging Notes

1 Debugging programs using gdb 1.1 gdb简介 gdb是一个功能强大的调试工具&#xff0c;可以用来调试C程序或C程序。在使用这个工具进行程序调试时&#xff0c;主要涉及下面几个方面的操作&#xff1a; 启动程序:在启动程序时&#xff0c;可以设置程序运行环境。设置断点:程序…

Linux socket编程(5):三次握手和四次挥手分析和SIGPIPE信号的处理

在我之前写的Wireshark抓包&#xff1a;理解TCP三次握手和四次挥手过程中&#xff0c;通过抓包分析了TCP传输的三次握手和四次挥手的过程。在这一节中&#xff0c;将分析在Linux中的三次握手和四次挥手的状态和过程&#xff0c;另外还有一个在我们编程过程中值得注意的SIGPIPE信…

水果音乐制作软件FL Studio21.2中文版新功能介绍

FL Studio21.2中文版&#xff0c;一般又称水果音乐制作软件。 FL Studio 21.2简称FL&#xff0c;全称FruityLoopsStudio&#xff0c;因此国人习惯叫它"水果"。它让你的计算机就像是全功能的录音室&#xff0c;大混音盘&#xff0c;非常先进的制作工具&#xff0c;让…

ZYNQ_project:lcd_pic_400x400

在lcd液晶屏上显示400x400像素的图片&#xff0c; 像素信息通过电脑的串口调试助手&#xff0c;发送给fpga&#xff0c;存储在例化的双端口ram中&#xff0c; 在要显示图像区域&#xff0c;读取ram中的像素信息。 模块框图&#xff1a; 时序图&#xff1a; 代码&#xff1a;…

代码随想录刷题】Day16 二叉树03

文章目录 1.【104】二叉树的最大深度&#xff08;优先掌握递归&#xff09;1.1 前言1.2 题目描述1.3 递归法java代码实现1.4 迭代法java代码实现1.5 相关练习题【559】N叉树的最大深度 2.【111】二叉树的最小深度&#xff08;优先掌握递归&#xff09;2.1 题目描述2.2 递归法ja…

新建模板,或组件自适应

1&#xff0c;***一定要改为固定布局&#xff08;才可以自适应&#xff09; 2&#xff0c; 3&#xff0c; 4&#xff0c;系统序号“1”就是第一根柱 5&#xff0c;系列-自动-配色这里1就是第一根柱颜色&#xff0c;2..... 6&#xff0c;坐标柱 标红的去掉&#xff0c;在那里设…

seismicunix基础-声波波动方程推导

seismicunix基础-声波波动方程推导 接触波动方程的研究人员都绕不开这个公式&#xff0c;这是在一维状态下波动方程 但是对于这个方程是怎样来的很少有人能说清楚&#xff0c;其中涉及到牛顿第二运动定律&#xff0c;物体的加速度与受到的力有关。 假设一维弦是大量紧密连接的质…

Python Web框架的三强之争:Flask、Django和FastAPI

JetBrains 公布 2022 Python 开发者调查结果。 完整报告地址&#xff1a;https://lp.jetbrains.com/zh-cn/python-developers-survey-2022/ 这是由 Python 软件基金会 (PSF) 和 JetBrains 共同开展的第六次官方年度 Python 开发者调查&#xff0c;回复于 2022 年 10 月至 12 …

SpringBoot:ch02 配置文件(日志)

前言 简单介绍 Spring Boot 中常见的配置文件类型&#xff0c;如 application.properties 和 application.yml 等&#xff0c;并说明它们各自的特点和用途。 一、前期准备 1、新建项目&#xff0c;结构如下 2、添加依赖 <?xml version"1.0" encoding"UTF…

七、HDFS文件系统的存储原理

1、总结 之所以把总结放在文件开头&#xff0c;是为了让读者对这篇文章有更好的理解&#xff0c;&#xff08;其实是因为我比较懒……&#xff09; 对于整个HDFS文件系统的存储原理&#xff0c;我们可以总结为一句话&#xff0c;那就是&#xff1a; 分块备份 2、存储结构和问题…

智能座舱架构与芯片- (4) 硬件篇 中

2.4 高速视频传输(GMSL) 为了解决未来汽车系统所面临的问题&#xff0c;美信(Maxim)推出了全新下一代GMSL技术&#xff0c;即吉比特多媒体串行链路(GMSL)串行器和解串器&#xff0c;用来支持未来ADAS和信息娱乐系统要求的宽带、互联复杂度和数据完整性的要求。 GMSL技术可以支…

图Graph的存储、图的广度优先搜索和深度优先搜索(待更新)

目录 一、图的两种存储方式 1.邻接矩阵 2.邻接表 生活中处处有图Graph的影子&#xff0c;例如交通图&#xff0c;地图&#xff0c;电路图等&#xff0c;形象的表示点与点之间的联系。 首先简单介绍一下图的概念和类型&#xff1a; 图的的定义&#xff1a;图是由一组顶点和一…

webpack 配置

1、基础配置 // node js核心模塊 const path require(path) // 插件是需要引入使用的 const ESLintPlugin require(eslint-webpack-plugin) // 自动生成index.html const HtmlWebpackPlugin require(html-webpack-plugin); // 将css文件单独打包&#xff0c;在index.html中…

Windows系统如何安装与使用TortoiseSVN客户端,并实现在公网访问本地SVN服务器

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统&#xff0c;它与Apache Subversion&#xff08;SVN&#xff09;集成在一起&#xff0c;提供了一个用户友好的界面&#xff0c;方便用…

计算机基础知识56

choices参数的使用 # 应用场景&#xff1a; 学历&#xff1a;小学、初中、高中、本科、硕士、博士、1 2 3 4 5 6 客户来源: 微信渠道、广告、介绍、QQ、等等 性别&#xff1a;男、女、未知 # 对于以上可能被我们列举完的字段我们一般都是选择使用…

【JavaEE】Spring的创建和使用(保姆级手把手图解)

一、创建一个Spring项目 1.1 创建一个Maven项目 1.2 添加 Spring 框架支持 在pom.xml中添加 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.3.RELEASE&…

智能座舱架构与芯片- (15) 测试篇 下

三、持续集成与交付 3.1 自动化编译框架 在智能座舱软件中&#xff0c;分为上层应用软件和底层软件。有些上层应用软件是与指令集平台无关的&#xff0c;例如Java应用程序等&#xff0c;它们对所运行的CPU平台没有依赖性&#xff0c;可以很好的适配当前平台进行执行。而在底层…

IDEA JRebel安装使用教程

1、下载插件 版本列表&#xff1a;https://plugins.jetbrains.com/plugin/4441-jrebel-and-xrebel/versions 下载&#xff1a;JRebel and XRebel 2022.4.1 这里下载2022.4.1版本&#xff0c;因为后续新版本获取凭证会比较麻烦。下载完成会是一个压缩包。 2、安装 选择第一步…