【c++】计算树的深度和节点数

在C语言中,计算给定树的层数(深度)和节点总数通常需要使用递归方法。首先,我们需要定义树的节点结构。这里假设我们处理的是一棵二叉树,每个节点有两个子节点(左子节点和右子节点)。

下面是一个简单的二叉树节点的结构定义以及计算树的层数(深度)和节点总数的函数实现:

#include <stdio.h>
#include <stdlib.h>// 定义二叉树节点结构体
typedef struct TreeNode {int value; // 节点存储的值,根据实际情况可以改变类型struct TreeNode *left; // 指向左子节点的指针struct TreeNode *right; // 指向右子节点的指针
} TreeNode;// 函数声明
int maxDepth(TreeNode* root);
int countNodes(TreeNode* root);// 计算树的最大深度(层数)
int maxDepth(TreeNode* root) {if (root == NULL) {return 0; // 空树的深度为0}int leftDepth = maxDepth(root->left); // 计算左子树的深度int rightDepth = maxDepth(root->right); // 计算右子树的深度return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1; // 当前树的深度为较大的子树深度加1
}// 计算树的节点总数
int countNodes(TreeNode* root) {if (root == NULL) {return 0; // 空树没有节点}return countNodes(root->left) + countNodes(root->right) + 1; // 总数等于左子树节点数加右子树节点数再加1(当前节点)
}// 创建新节点
TreeNode* createNode(int value) {TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));if (!newNode) {return NULL;}newNode->value = value;newNode->left = NULL;newNode->right = NULL;return newNode;
}// 函数声明
void freeTree(TreeNode* root);// 释放树的内存
void freeTree(TreeNode* root) {if (root == NULL) {return; // 空指针不需要处理}freeTree(root->left); // 递归释放左子树freeTree(root->right); // 递归释放右子树free(root); // 释放当前节点
}// 主函数示例
int main() {// 创建示例树//         1//       /   \//      2     3//     / \   ///    4   5 6TreeNode* root = createNode(1);root->left = createNode(2);root->right = createNode(3);root->left->left = createNode(4);root->left->right = createNode(5);root->right->left = createNode(6);printf("Tree Depth: %d\n", maxDepth(root));printf("Total Nodes: %d\n", countNodes(root));// 释放内存freeTree(root);return 0;
}

这段代码首先定义了二叉树节点的结构体TreeNode,然后实现了两个关键函数:maxDepth用于计算树的最大深度(层数),而countNodes用于计算树的节点总数。这两个函数都采用了递归的方式来进行计算。

要将计算树深度和总节点数的功能合并到一个函数中,我们可以定义一个辅助结构来同时存储这两个值
首先,定义一个结构体来存储树的深度和节点总数:

#include <stdio.h>
#include <stdlib.h>typedef struct TreeNode {int value;struct TreeNode *left, *right;
} TreeNode;typedef struct TreeInfo {int depth;int numNodes;
} TreeInfo;

然后,实现一个递归函数来计算深度和节点总数:

TreeInfo calculateTreeInfo(TreeNode* root) {TreeInfo info = {0, 0}; // 初始化深度和节点数为0if (root == NULL) {return info; // 如果当前节点为空,返回深度和节点数都为0的结构}// 递归计算左右子树的信息TreeInfo leftInfo = calculateTreeInfo(root->left);TreeInfo rightInfo = calculateTreeInfo(root->right);// 当前节点的深度是左右子树深度的最大值加1info.depth = (leftInfo.depth > rightInfo.depth ? leftInfo.depth : rightInfo.depth) + 1;// 节点总数是左右子树节点数之和加上当前节点(1)info.numNodes = leftInfo.numNodes + rightInfo.numNodes + 1;return info; // 返回包含当前节点信息的结构
}

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

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

相关文章

5.STL源码解析-算法、仿函数、适配器

算法 STL算法总览 仿函数与适配器 C标准模板库&#xff08;STL&#xff09;是C程序员的得力工具&#xff0c;提供了许多强大而高效的数据结构和算法。在STL中&#xff0c;仿函数&#xff08;Functor&#xff09;和适配器&#xff08;Adapter&#xff09;是两个重要的概念…

C语言文件操作(fputs() 和 puts() 有两个小区别)

fputs() 和 puts() 有两个小区别&#xff1a; 1.puts() 只能向标准输出流输出&#xff0c;而 fputs() 可以向任何流输出。 2.使用 puts() 时&#xff0c;系统会在自动在其后添加换行符&#xff1b;而使用 fputs() 时&#xff0c;系统不会自动添加换行符。 那么这是不是意味着使…

【C++精简版回顾】17.io流,流中提供的函数

1.流含义 2.流类 3.流对象 4.流对象的函数 举例&#xff1a; 要求&#xff1a;数据结构中经常需要对齐输出数据&#xff0c;应该怎么做&#xff1f; 1.头文件 #include<iomanip> 2.创建表格头 cout << setiosflags(ios::left) << setw(8) << "姓名…

BUGKU 网站被黑

打开环境&#xff0c;什么都没发现&#xff0c;使用蚁剑扫描一下&#xff0c;发现shell.php&#xff0c;打开 使用BP抓包&#xff0c;进行爆破 得到密码&#xff1a;hack 进去得到flag

GEE高阶应用python wxee——如何利用来自 GOES-16 和 MODIS 的数据来可视化火灾随时间的进展分析

火灾进展 wxee 是专为处理气象数据而设计的,但它对遥感数据也很有用。在本示例中,我们将了解 wxee 如何利用来自 GOES-16 和 MODIS 的数据来可视化火灾随时间的进展情况。 安装和设定 #!pip install wxeeimport ee import wxeeee.Authenticate() wxee.Initialize(project=x…

每日一类:QLabel深入解析

QLabel是Qt中用于显示文本或图像的控件&#xff0c;属于Qt Widgets模块。它是展示静态内容的理想选择&#xff0c;支持富文本格式&#xff0c;使得文本可以包含不同的字体、颜色和链接。QLabel也可以用来显示图像&#xff0c;包括动态图像。此外&#xff0c;它还支持文本和图像…

【Java面试题】SpringBoot与Spring的区别

主要区别体现几个方面&#xff1a; 1.操作简便性 SpringBoot提供极其快速和简化的操作&#xff0c;使得Spring开发者能更快速上手。它通过提供spring的运行配置&#xff0c;以及为通用spring项目提供许多非功能性特性&#xff0c;进一步简化了开发过程。 2.框架扩展性 Spri…

算法学习——差分

在了解差分之前&#xff0c;我们首先需要知道前缀和的概念。 前缀和简单介绍&#xff1a; 对于一个数组A&#xff0c;要求出A[0]~A[i]的和&#xff0c;我们通常的做法是遍历一边&#xff0c;加起来。但是要求m组这样的和&#xff0c;我们就要花费O(mn)的时间复杂度。显然不合…

【考研数学】汤家凤1800题什么水平?

我觉得汤家凤基础武忠祥强化这个组合非常的不错 汤家凤老师的讲课风格 汤家凤老师的基础课程是大家公认的讲的详细&#xff0c;并且非常照顾基础不好的学生&#xff0c;会把基础知识点掰开揉碎的讲给大家听&#xff0c;在上课过程中&#xff0c;还会把知识点写在A4纸上&#…

试了下新型的360AI搜索

360AI搜索 试了下&#xff0c;感觉还是挺不错的。 比如问这个问题&#xff1a; ERROR 1698 (28000): Access denied for user rootlocalhost 它的回答&#xff1a; 对于ERROR 1698 (28000): Access denied for user rootlocalhost的问题&#xff0c;这通常是由于MySQL密码为…

【Javascript】设计模式之单例模式

文章目录 1、实现单例模式2、透明的单例模式3、用代理实现单例模式4、JavaScript 中的单例模式5、惰性单例6、通用的惰性单例7、小结 定义&#xff1a; 保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点 单例模式是一种常用的模式&#xff0c;有一些对象我们往…

JavaScript 学习总结(16)—— 实用小函数总结

1.匹配正整数 // 匹配正整数 let isPositiveNum = val => {return /^[1-9]d*$/.test(val); }; console.log(isPositiveNum(9)) //true console.log(isPositiveNum(2.2)) //false 2.匹配负整数 // 匹配负整数let isNegativeNum = val => {return /^-[1-9]d*$/.test(val…

R750 install AMD MI210GPU

一、 查看服务器GPU卡信息 可以首先在服务器上check 当前GPU的详细信息是否匹配 二、安装 Ubuntu22.04操作系统 服务器CHECK 安装的AMD GPU 是否被系统识别 #lspci | grep AMD 查看GPU信息 可以看到已经识别成功 三、安装AMD GPU驱动 https://rocm.docs.amd.com/projec…

linux 根目录下结构

/ 虚拟目录的根的目录&#xff0c;通常不会在这里放置文件 /bin&#xff1a;存放频繁使用的命令,二进制文件&#xff0c;存放了很多用户级的GNU实用工具。 /boot&#xff1a;引导目录&#xff0c;存放引导文件&#xff0c;包含启动Linux所需的核心文件。 /dev&#xff1a;设…

智能驾驶规划控制理论学习05-车辆运动学规划案例分析

目录 案例一——Hybrid A*&#xff08;基于正向运动学&#xff09; 1、基本思想 2、 实现流程 3、启发函数设计 4、分析扩张&#xff08;Analytic Expansions&#xff09; 5、分级规划&#xff08;Hierarchical planning&#xff09; 案例二——State Lattice Planning&…

子矩阵的和 刷题笔记 {二维前缀和}

首先我们的目标是让 s[i][j]表示为其左方和上方形成的矩阵所有元素的和 加上s[i-1][j]和s[i][j-1]后 s[i-1][j-1]部分重复了所以减去 最后加上a[i][j]即可完成目标 s[i][j]s[i-1][j]s[i][j-1]-s[i-1][j-1]a[i][j]; 然后看题目要求 要求x1,y1,x2,y2围成的小正方形内的元素和…

C/C++工程师面试题(数据库篇)

索引的优缺点 索引是一种支持快速查找特定行的数据结构&#xff0c;如果没有索引&#xff0c;就需要遍历整个表进行查找。用于提高数据检索的速度和效率。 好处&#xff1a; 提高检索速度&#xff1a; 索引可以加快数据的检索速度&#xff0c;因为它们允许数据库系统直接定位到…

Revit-二开之立面视图创建FilledRegion-(3)

在上一篇博客中介绍了FilledRegion的创建方法,这种方法通常只在平面视图中适用,在三维视图中也是无法创建的(目前研究的是这样的,如果有其他方法,请赐教)。 本片文章介绍一个下在立面视图中创建FilledRegion的方法,主要操作是在立面视图中拾取一个点,然后以该点为原点,…

YOLOv5 项目:推理代码和参数详细介绍(detect)

1、前言 本章将介绍yolov5项目的推理函数&#xff0c;关于yolov5的下载和配置环境&#xff0c;参考上一篇文章&#xff1a; YOLOv5 项目&#xff1a;环境配置-CSDN博客 pycharm 中打开的推理模块如红框中所示 pycharm将conda新建的虚拟环境导入&#xff0c;参考 &#xff1a;…

快速模幂(c++题解)

题目描述 试求ab%n的值&#xff0c;其中a、b、n均为整数范围内的数。 输入格式 三个整数即a、b、n。 输出格式 输出结果。 样例 样例输入 复制1 1 1样例输出 复制0 _____________________________________________________________________________ ok呀总算学到一个…