909-2015-T2

文章目录

  • 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.运行结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

编写函数求定积分的通用函数

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 不积跬步无以至千里&#xff0c;…

子虔科技亮相2023工业软件生态大会 以先进理念赋能工业软件发展

作为云化工业软件领先企业&#xff0c;子虔科技携多项全新云原生产品亮相2023工业软件生态大会。 本届大会以“共建新一代工业软件体系&#xff0c;引领制造业高质量发展”为主题&#xff0c;集结行业领先企业、行业专家探究工业软件在核心技术、产业链创新和生态建设等方面创…

navicat --CSV导出数据乱码情况(三种情况解决方式)

CSV导出数据乱码情况分析及处理 在navicat 中有很多导出方式&#xff0c;大家都知道csv导出要比xlse要快很多&#xff0c;但是在使用csv导出时要防止乱码情况&#xff0c; 下面我列出三种处理方式&#xff08;如有其他方式大家可以帮忙补充一下&#xff09;&#xff1a; 文章目…

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

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

Spark---介绍及安装

一、Spark介绍 1、什么是Spark Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行计算框架&#xff0c;Spark拥有Hadoop MapReduce所具有的优点&#xff1b;但…

.nvmrc 文件使用详解

文章目录 1. 前言2. .nvmrc 是什么3. 创建 .nvmrc 文件4. 使用 .nvmrc 文件5. 终端自动切换版本 1. 前言 当开发多个项目时&#xff0c;每个项目运行环境要求的 node 版本不一样&#xff0c;那么我们就需要给每个项目指定 node 版本&#xff0c;也就是通过终端执行 nvm install…

用Auth Analyzer插件批量测试接口越权,安全测试快人一步!

随着信息化技术的不断发展&#xff0c;软件安全成了软件行业的重大挑战&#xff0c;因此安全测试也成为了测试人员必备的技能之一。 沐沐在安全测试过程中较为常见的就是接口越权漏洞&#xff0c;在尝试过多种工具进行越权漏洞测试后&#xff0c;最终找到了个人认为最便捷最有…

[C++ 从入门到精通] 12.重载运算符、赋值运算符重载、析构函数

&#x1f4e2;博客主页&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 丶布布原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&#x1f4e2;现…

c++|引用

目录 一、引用概念 二、引用特性 三、常引用 &#xff08;具有常属性的引用变量&#xff09; 四、使用场景 一、引用概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;他和他引用的变量共用同…

Java动态代理JKD版本

1、ISale.java package com.atguigu; public interface ISale {void saleShaoBing();void saleJianBing();void saleYueBing();void saleManTou(); }2、WuDa.java package com.atguigu;//Target:目标类、目标对象 public class WuDa implements ISale{//target method:目标方法…

Polygon Miden VM架构总览

1. 计算类型 Programs程序有2种类型&#xff1a; 1&#xff09;Circuit电路&#xff1a;即&#xff0c;程序即电路。将程序转换为电路。2&#xff09;Virtual machine虚拟机&#xff1a;即&#xff0c;程序为电路的输入。【Miden VM属于此类型】 2. 何为ZK virtual machine…

用Markdown Nice写作

网址&#xff1a;https://www.mdnice.com/ 代码 表格 第二行用来对齐&#xff1a; -表示左对齐 :-:表示居中 -:表示右对齐 数学 上下标 分数 累加 幂 对数 根式 微积分 交集、并集 格式 标题 缩进 删除线 斜体 加粗 参考文献

【ArcGIS Pro二次开发】(77):ArcGIS Pro中图层的获取与解析

一、最简单的获取图层方式 通常情况下&#xff0c;如果要获取当前地图中的图层&#xff0c;可以用2种方法获取。 以下图为例&#xff1a; 一种是【map.Layers】属性获取&#xff0c;结果如下&#xff1a; 可以看出&#xff0c;这里只获取到了第一层级的图层&#xff0c;图层组…

目标检测 详解SSD原理,数据处理与复现

原理详解 前言 今天我们要读的这篇VGGNet&#xff08;《Very Deep Convolutional Networks For Large-Scale Image Recognition》&#xff09;&#xff0c;就是在AlexNet基础上对深度对网络性能的影响做了进一步的探索。它是ImageNet 2014年亚军&#xff0c;相比于AlexNet&am…

inBuilder低代码平台新特性推荐-第九期

各位知乎的友友们&#xff0c;大家好~ 今天来给大家带来的是inBuilder低代码平台特性推荐系列第九期——子表弹出新增&#xff01; 01 概述 子表弹出新增&#xff0c;是低代码平台提供的一种前端输入组件&#xff0c;在子表字段较多的场景中&#xff0c;有时为了方便…

代码随想录刷题】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…

智能高效的转运机器人,为物流行业注入新动力

在当今社会&#xff0c;随着科技的不断发展&#xff0c;机器人已经逐渐融入到我们的生活中。其中&#xff0c;转运机器人作为物流行业的新秀&#xff0c;正以其高效、智能的特点&#xff0c;引起了广泛的关注。 转运机器人&#xff0c;是指能够自主进行物品搬运和运输的机器人…

说一下类的生命周期

&#x1f47d;System.out.println(“&#x1f44b;&#x1f3fc;嗨&#xff0c;大家好&#xff0c;我是代码不会敲的小符&#xff0c;双非大四&#xff0c;Java实习中…”); &#x1f4da;System.out.println(“&#x1f388;如果文章中有错误的地方&#xff0c;恳请大家指正&a…

开始通过 Amazon SageMaker JumpStart 在亚马逊云科技上使用生成式 AI

目前&#xff0c;生成式 AI 正受到公众的广泛关注&#xff0c;人们围绕着许多人工智能技术展开讨论。很多客户一直在询问有关亚马逊云科技生成式 AI 解决方案的更多信息&#xff0c;本文将为您进行解答。 这篇文章通过一个真实的客户使用案例概述了生成式 AI&#xff0c;提供了…

京东数据分析软件(京东平台数据分析):2023年Q3扫地机器人行业消费报告

随着90后、00后逐渐成为消费主力军&#xff0c;他们对生活品质更加关注、健康意识进一步增强&#xff0c;再加上“懒人经济”的盛行&#xff0c;人们对扫地机器人的使用率和关注热情也不断增长。 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年7月份-9月份&#xf…