909-2014-T2

文章目录

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

在这里插入图片描述

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

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

相关文章

什么是高防CDN?有什么优势?

德迅高防CDN技术概述 随着互联网的快速发展&#xff0c;网络安全问题越来越受到人们的关注。高防CDN(Content Delivery Network)作为一种有效的网络安全防御手段&#xff0c;在企业和个人网站中得到了广泛应用。本文将详细介绍高防CDN的技术原理、防御原理、优点和应用场景&am…

TransmittableThreadLocal - 线程池中也可以传递参数了

一、InheritableThreadLocal的不足 InheritableThreadLocal可以用于主子线程之间传递参数&#xff0c;但是它必须要求在主线程中手动创建的子线程才可以获取到主线程设置的参数&#xff0c;不能够通过线程池的方式调用。 但是现在我们实际的项目开发中&#xff0c;一般都是采…

用 HLS 实现 UART

用 HLS 实现 UART 介绍 UART 是一种旧的串行通信机制&#xff0c;但仍在很多平台中使用。它在 HDL 语言中的实现并不棘手&#xff0c;可以被视为本科生的作业。在这里&#xff0c;我将通过这个例子来展示在 HLS 中实现它是多么容易和有趣。 因此&#xff0c;从概念上讲&#xf…

秋招JAVA面经总结

面试的范围是Java基础+Java并发+Java框架+mysql+网络。 Java基础 重载与重写有什么区别? 重载(Overloading)指的是在同一个类中,可以有多个同名方法,它们具有不同的参数列表(参数类型、参数个数或参数顺序不同),编译器根据调用时的参数类型来决定调用哪个方法。 重写…

会声会影2024出来了吗?会声会影2023怎么使用?

会声会影20247中文旗舰版 Corel VideoStudio 是一款功能强大的视频编辑软件&#xff0c;可以帮助用户创建高质量的视频作品。它提供了一系列完善的编辑功能&#xff0c;包括视频编辑、音频编辑、调色、特效、字幕、标题等。它还支持多种视频格式&#xff0c;可以将视频转换为多…

CSDN专栏设置

文章目录 一、规则1.1、专栏数量与等级关联1.2、等级与积分关联1.3、积分1.3.1、积分获取1.3.2、积分被扣 二、配置2.1、入口2.2、新建2.2.1、一级专栏2.2.2、二级专栏 2.3、快捷编辑2.4、拖拽 一、规则 写了一阵子CSDN博客后&#xff0c;发现自己新增专栏的时候提示不能再新增…

Linux调度域与调度组

引入调度域的讨论可以参考这篇文章。这篇笔记重点分析了内核调度域相关的数据结构以及内核用于构建调度域的代码实现&#xff0c;以此来加深对调度域的理解。调度域是调度器进行负载均衡的基础。 调度域拓扑层级 整个系统的调度域组成一个层级结构&#xff0c;内核设计了stru…

909-2015-T2

文章目录 1.原题2.算法思想3.关键代码4.完整代码5.运行结果 1.原题 编写算法&#xff0c;删除二叉搜索树&#xff08;二叉排序树&#xff09;的最小元素。叙述算法思想并给出算法实现&#xff0c;分析算法复杂性。二叉树采用链式存储结构&#xff0c;节点结构如下&#xff1a;…

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

归纳编程学习的感悟&#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; -表示左对齐 :-:表示居中 -:表示右对齐 数学 上下标 分数 累加 幂 对数 根式 微积分 交集、并集 格式 标题 缩进 删除线 斜体 加粗 参考文献