909-2014-T2

news2024/9/25 9:35:21

文章目录

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

1.原题

二叉树采用二叉链表存储结构,设计算法,判断二叉树是否为满二叉树。叙述算法思想并给出算法实现。

2.算法思想

通过一次遍历,得到结点个数和树的高度。用结点个数和树的高度的关系来判断是否为满二叉树。

3.关键代码

/**
 * @struct treeNode
 * @brief 二叉树节点结构体。
 */
struct treeNode {
    int data; /**< 节点中存储的数据 */
    struct treeNode *lchild; /**< 指向左子节点的指针 */
    struct treeNode *rchild; /**< 指向右子节点的指针 */
};

/**
 * @brief 计算二叉树的高度
 *
 * 递归计算二叉树的高度,并记录节点数。
 *
 * @param root 二叉树根节点指针
 * @param n 指向节点数的指针,记录二叉树的节点数
 * @return int 二叉树高度
 */
int treeHeight(struct treeNode *root, int *n) {
    // 若根节点为空,则高度为0
    if (root == NULL) {
        return 0;
    } else {
        // 递归计算左子树高度
        int leftTreeHeight = treeHeight(root->lchild, n);
        // 若左子树不为空,则节点数加1
        if (leftTreeHeight) {
            (*n)++;
        }
        // 递归计算右子树高度
        int rightTreeHeight = treeHeight(root->rchild, n);
        // 若右子树不为空,则节点数加1
        if (rightTreeHeight) {
            (*n)++;
        }
        // 返回左右子树中的最大高度并加上根节点的高度
        return (leftTreeHeight > rightTreeHeight ? leftTreeHeight : rightTreeHeight) + 1;
    }
}

/**
 * @brief 判断二叉树是否为满二叉树
 *
 * 验证二叉树是否为满二叉树,并输出节点数及高度信息。
 *
 * @param root 二叉树根节点指针
 */
void isTreeFull(struct treeNode *root) {
    // 若根节点为空,则是空树
    if (root == NULL) {
        printf("This is an empty tree.\n");
        return;
    }

    int n = 1;
    int height = treeHeight(root, &n); // 获取树的高度和节点数

    printf("number of the tree: %d\n", n); // 输出节点数
    printf("height of the tree: %d\n", height); // 输出树的高度

    // 判断是否为满二叉树
    if (n == ((int) pow(2, height) - 1)) {
        printf("This is a full tree.\n"); // 是满二叉树
    } else {
        printf("This is not a full tree.\n"); // 不是满二叉树
    }
}

4.完整代码

/**
 * @file main.c
 * @brief 实现了二叉树及其相关操作。
 */

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

/**
 * @struct treeNode
 * @brief 二叉树节点结构体。
 */
struct treeNode {
    int data; /**< 节点中存储的数据 */
    struct treeNode *lchild; /**< 指向左子节点的指针 */
    struct treeNode *rchild; /**< 指向右子节点的指针 */
};

/**
 * @brief 计算二叉树的高度
 *
 * 递归计算二叉树的高度,并记录节点数。
 *
 * @param root 二叉树根节点指针
 * @param n 指向节点数的指针,记录二叉树的节点数
 * @return int 二叉树高度
 */
int treeHeight(struct treeNode *root, int *n) {
    // 若根节点为空,则高度为0
    if (root == NULL) {
        return 0;
    } else {
        // 递归计算左子树高度
        int leftTreeHeight = treeHeight(root->lchild, n);
        // 若左子树不为空,则节点数加1
        if (leftTreeHeight) {
            (*n)++;
        }
        // 递归计算右子树高度
        int rightTreeHeight = treeHeight(root->rchild, n);
        // 若右子树不为空,则节点数加1
        if (rightTreeHeight) {
            (*n)++;
        }
        // 返回左右子树中的最大高度并加上根节点的高度
        return (leftTreeHeight > rightTreeHeight ? leftTreeHeight : rightTreeHeight) + 1;
    }
}

/**
 * @brief 判断二叉树是否为满二叉树
 *
 * 验证二叉树是否为满二叉树,并输出节点数及高度信息。
 *
 * @param root 二叉树根节点指针
 */
void isTreeFull(struct treeNode *root) {
    // 若根节点为空,则是空树
    if (root == NULL) {
        printf("This is an empty tree.\n");
        return;
    }

    int n = 1;
    int height = treeHeight(root, &n); // 获取树的高度和节点数

    printf("number of the tree: %d\n", n); // 输出节点数
    printf("height of the tree: %d\n", height); // 输出树的高度

    // 判断是否为满二叉树
    if (n == ((int) pow(2, height) - 1)) {
        printf("This is a full tree.\n"); // 是满二叉树
    } else {
        printf("This is not a full tree.\n"); // 不是满二叉树
    }
}

/**
 * @brief 创建新节点。
 * @param data 节点数据。
 * @return 新节点指针。
 */
struct treeNode *createNode(int data) {
    struct treeNode *newNode = (struct treeNode *) malloc(sizeof(struct treeNode));
    newNode->data = data;
    newNode->lchild = NULL;
    newNode->rchild = NULL;
    return newNode;
}

/**
 * @brief 输出二叉树的括号表示法结构。
 * @param root 二叉树根节点指针。
 */
void printTree(struct treeNode *root) {
    if (root == NULL) {
        return;
    }
    printf("(%d", root->data);
    if (root->lchild != NULL || root->rchild != NULL) {
        printf(" ");
        if (root->lchild == NULL) {
            printf("( )");
        } else {
            printTree(root->lchild);
        }
        printf(" ");
        if (root->rchild == NULL) {
            printf("( )");
        } else {
            printTree(root->rchild);
        }
    }
    printf(")");
}


/**
 * @brief 主函数展示二叉树操作。
 * @return 程序退出状态。
 */
int main() {
    struct treeNode *root = createNode(1); // 根节点为1
    root->lchild = createNode(2);
    root->rchild = createNode(3);
    root->lchild->lchild = createNode(4);
    root->lchild->rchild = createNode(5);
    root->rchild->lchild = createNode(6);
    root->rchild->rchild = createNode(7);

    printf("Binary Tree in Parenthesis Representation: ");
    printTree(root);
    printf("\n");

    isTreeFull(root);

    return 0;
}

5.运行结果

在这里插入图片描述

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

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

相关文章

Spring Cloud实战 |分布式系统的流量控制、熔断降级组件Sentinel如何使用

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…

PowerShell无人参与安装最新版本SQL Server Management Studio (SSMS)

文章目录 下载SQL Server Management Studio (SSMS)Power Shell实现无人安装推荐阅读 下载SQL Server Management Studio (SSMS) SSMS 19.2 是最新的正式发布 (GA) 版本。 如果已经安装了 SSMS 19 预览版&#xff0c;需要在安装 SSMS 19.2 之前将其卸载。 如果安装了 SSMS 19.…

java io流中为什么使用缓冲流就能加快文件读写速度

FileInputStream的read方法底层确实是通过调用JDK层面的read方法&#xff0c;并且这个JDK层面的read方法底层是使用C语言编写的&#xff0c;以实现高效的文件读取功能。但是它会涉及多次内核态与操作系统交互。当我们使用FileInputStream的read方法读取文件时&#xff0c;首先会…

Java并发编程第12讲——cancelAcquire()流程详解及acquire方法总结

上篇文章介绍了AQS的设计思想以及独占式获取和释放同步状态的源码分析&#xff0c;但是还不够&#xff0c;一是感觉有点零零散散&#xff0c;二是里面还有很多细节没介绍到——比如cancelAcquire()方法&#xff08;重点&#xff09;&#xff0c;迫于篇幅原因&#xff0c;今天就…

[超详细]基于YOLO&OpenCV的人流量统计监测系统(源码&部署教程)

1.图片识别 2.视频识别 [YOLOv7]基于YOLO&#xff06;Deepsort的人流量统计系统(源码&#xff06;部署教程)_哔哩哔哩_bilibili 3.Deepsort目标追踪 &#xff08;1&#xff09;获取原始视频帧 &#xff08;2&#xff09;利用目标检测器对视频帧中的目标进行检测 &#xff08…

MAX/MSP SDK学习04:Messages selector的使用

其实消息选择器在simplemax示例中就接触到了&#xff0c;但这文档非要讲那么抽象。目前为止对消息选择器的理解是&#xff1a;可判断接收过来的消息是否符合本Object的处理要求&#xff0c;比如加法对象只可接收数值型的消息以处理&#xff0c;但不能接收t_symbol型的消息&…

2024电脑录屏软件排行第一Camtasia喀秋莎

真的要被录屏软件给搞疯了&#xff0c;本来公司说要给新人做个培训视频&#xff0c;想着把视频录屏一下&#xff0c;然后简单的剪辑一下就可以了。可谁知道录屏软件坑这么多&#xff0c;弄来弄去头都秃了&#xff0c;不过在头秃了几天之后&#xff0c;终于让我发现了一个值得“…

ck 配置 clickhouse-jdbc-bridge

背景 ck可以用过clickhouse-jdbc-bridge技术来直接访问各数据库 安装配置 需要准备的文件 clickhouse-jdbc-bridge https://github.com/ClickHouse/clickhouse-jdbc-bridge 理论上需要下载源码然后用mavne打包&#xff0c;但提供了打包好的&#xff0c;可以推测用的是mave…

层层剥开Android14升级后异常弹框的神秘面纱

本篇文章将会通过研究源码的方式给您讲述Android系统升级到Android14后出现的两个异常弹框并给出消除它们的方案。闲话少叙&#xff0c;我们开始。 问题描述 在Android 14升级后&#xff0c;出现两个弹窗的异常情况。这里是异常的截图&#xff1a; 接下来&#xff0c;我们对这…

1-verilog的串行滤波器FIR实现

verilog的串行滤波器FIR实现 1&#xff0c;RTL代码2&#xff0c;RTL原理框图3&#xff0c;测试代码4&#xff0c;输出FIR滤波器的波形 参考文献: 1&#xff0c;基于FPGA的串行FIR滤波器设计与实现 2&#xff0c;FPGA实现FIR滤波器 1&#xff0c;RTL代码 timescale 1ns / 1ps /…

子虔与罗克韦尔自动化合作 进博会签约自动化净零智造联创中心

11月6日进博会现场&#xff0c;漕河泾罗克韦尔自动化净零智造联创中心合作协议签约暨合作伙伴&#xff08;第一批&#xff09;授牌仪式举办&#xff0c;子虔科技作为联创中心合作伙伴签约&#xff0c;携手共建智能制造&#xff0c;引领行业可持续发展。 图示&#xff1a;子虔科…

从0开始学习JavaScript--深入理解JavaScript的async/await

JavaScript的异步编程在过去经历了回调地狱、Promise的引入&#xff0c;而今&#xff0c;通过async/await&#xff0c;让我们获得了更加优雅、可读性更高的异步编程方式。本文将深入探讨async/await的概念、用法&#xff0c;并通过丰富的示例代码展示其在实际应用中的威力。 理…

SPDK NVMe-oF target多路功能介绍

基本概念 SPDK NVMe-oF target multi-path是基于NVMe协议的multi-path IO和namespace sharing功能。 NVMe multi-path IO指的是两个或多个完全独立的PCI Express路径存在于一个主机和一个命名空间。 而namespace 共享是两个或多个主机使用不同的NVMe控制器访问一个shared na…

2023.11.22使用flask做一个简单的图片浏览器

2023.11.22使用flask做一个简单的图片浏览器 功能&#xff1a; 实现图片浏览&#xff08;翻页&#xff09;功能 程序页面&#xff1a; 程序架构&#xff1a; 注意&#xff1a;在flask中常会使用src“{{ url_for(‘static’, filename‘images/’ image) }}”&#xff0c…

利用ros实现单片机通讯(转载)

我觉得如果使用这个人的micro_ros通信协议&#xff0c;就不用再去Ubuntu或者Windows上面自己写驱动程序了&#xff0c; 利用micro_ros实现esp32与ros2的通讯 Tianci ​ 天津大学 工学博士 参考&#xff1a;https://github.com/micro-ROS/micro_ros_arduino https://blog.cs…

【开源】基于Vue和SpringBoot的服装店库存管理系统

项目编号&#xff1a; S 052 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S052&#xff0c;文末获取源码。} 项目编号&#xff1a;S052&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 服…

森林之子/Sons Of The Forest V42457 资源分享

游戏介绍&#xff1a; 视频介绍&#xff1a; 森林之子 资源分享 这里是引用 你被派到了一座孤岛上&#xff0c;寻找一位失踪的亿万富翁&#xff0c;结果却发现自己深陷被食人生物占领的炼狱之地。你需要制作工具和武器、建造房屋&#xff0c;倾尽全力生存下去&#xff0c;无论…

MySQL之BETWEEN AND包含范围查询总结

一、时间范围 查询参数格式与数据库类型相对应时&#xff0c;between and包含头尾&#xff0c;否则依情况 当数据库字段中存储的是yyyy-MM-dd格式&#xff0c;即date类型&#xff1a; 用between and查询&#xff0c; 参数yyyy-MM-dd格式时&#xff0c;包含头尾&#xff0c;相当…

【Flink】Process Function

目录 1、ProcessFunction解析 1.1 抽象方法.processElement() 1.2 非抽象方法.onTimer() 2、Flink中8个不同的处理函数 2.1 ProcessFunction 2.2 KeyedProcessFunction 2.3 ProcessWindowFunction 2.4 ProcessAllWindowFunction 2.5 CoProcessFunction 2.6 ProcessJo…

C++ 多态和虚函数详解

本文章内容来源于C课堂上的听课笔记 多态基础 多态&#xff08;Polymorphism&#xff09;是面向对象编程中的一个重要概念&#xff0c;它允许使用统一的接口来表示不同的对象和操作。多态性有两种主要形式&#xff1a;静态多态性&#xff08;编译时多态性&#xff09;和动态多…