首页 > 其他分享 >数据结构学习笔记-递归求解森林高度

数据结构学习笔记-递归求解森林高度

时间:2024-05-11 22:41:18浏览次数:16  
标签:函数 递归 int maxHeight 高度 笔记 二叉树 数据结构 root

森林的高度递归求解

问题描述:设计算法求解森林的高度

【算法设计思想】

两个函数,一个用于计算单个二叉树的高度,另一个用于计算二叉树森林(即一组二叉树)的最大高度。下面是对两个函数的详细解释:

1. treeHeight 函数

这个函数用于计算单个二叉树的高度。二叉树的高度定义为从根节点到最远叶子节点的最长路径上的边数。函数的参数是指向二叉树根节点的指针 root

函数的逻辑如下:

  • 如果 rootNULL(即空指针),表示当前节点为空,因此返回高度为0。
  • 如果 root 不为空,函数会递归地计算左子树 root->lChild 和右子树 root->rChild 的高度。
  • 通过比较左右子树的高度,取较大的那个高度,并在其基础上加1(因为还要包括当前节点),得到当前树的高度。
  • 返回当前树的高度。

2. forestHeight 函数

这个函数用于计算二叉树森林的最大高度。二叉树森林是一组二叉树的集合,每棵树由一个数组 forest 表示,其中数组的每个元素是一个指向二叉树根节点的指针。参数 numTrees 表示森林中树的数量。

函数的逻辑如下:

  • 初始化一个变量 maxHeight 为0,用于记录遍历过程中发现的最大高度。
  • 使用一个 for 循环遍历森林中的每一棵树。对于每棵树,通过调用 treeHeight 函数计算其高度。
  • 将计算得到的高度与当前记录的最大高度 maxHeight 进行比较,如果当前树的高度更大,则更新 maxHeight
  • 在遍历完所有树后,返回记录的最大高度 maxHeight

这段代码展示了如何通过递归和迭代的方式计算二叉树及其森林的高度。在实际应用中,这种计算对于理解数据结构的复杂性和设计算法非常重要。

【算法描述】

// 定义二叉树节点结构
typedef struct BiNode {
    char data;
    struct BiNode *lChild;
    struct BiNode *rChild;
} BiNode;

// 求解二叉树的高度
int treeHeight(BiNode* root) {
    if (root == NULL)
        return 0;

    // 递归计算左右子树的高度,并取最大值
    int leftHeight = treeHeight(root->lChild);
    int rightHeight = treeHeight(root->rChild);

    // 返回左右子树高度的最大值加上当前节点的高度(1)
    return (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;
}

// 求解森林的高度
int forestHeight(BiNode** forest, int numTrees) {
    int maxHeight = 0;

    // 遍历每棵树,求解其高度,并记录最大高度
    for (int i = 0; i < numTrees; ++i) {
        int height = treeHeight(forest[i]);
        if (height > maxHeight) {
            maxHeight = height;
        }
    }

    return maxHeight;
}

标签:函数,递归,int,maxHeight,高度,笔记,二叉树,数据结构,root
From: https://www.cnblogs.com/zeta186012/p/18187299

相关文章

  • FFT 学习笔记
    应用FFT,中文“快速傅里叶变换”,用来加速多项式乘法和卷积,可以将\(O(n^2)\)的复杂度优化至\(O(n\logn)\)。多项式系数表示法一个\(n\)次\(n+1\)项的多项式\(f(x)\)可以表示为\(f(x)=\sum\limits_{i=0}^{n}a_ix^i\)。也可以用每一项的系数表示\(f(x)\),即\(f......
  • Vue3笔记
    1.man.js文件//引入一个工厂函数createAppimport{createApp}from'vue'importAppfrom'./App.vue'//创建应用实例对象app---类似于vue2中的vm,但app比vm更'轻'constapp=createApp(App)console.log('app',app)app.mount('#app......
  • 笛卡尔树学习笔记
    笛卡尔树引入是一种二叉树,每个节点由一个二元组\((k,w)\)形成。\(k\)满足二叉搜索树的性质,\(w\)满足堆的性质。上面这棵笛卡尔树相当于把数组元素值当作键值\(w\),而把数组下标当作键值\(k\)。显然可以发现,这棵树的键值\(k\)满足二叉搜索树的性质,而键值\(w\)满足小根......
  • tp6 递归函数使用
    publicfunctionfindLastClass($id){$classInfo=Db::name('class')->where('id',$id)->find();if($classInfo&&$classInfo['islast']==1){//如果当前记录的islast为1,直接返回return$classInfo......
  • 复习笔记
    1.对变量延迟初始化延迟初始化使用的是lateinit关键字,它可以告诉Kotlin编译器,我会在晚些时候对这个变量进行初始化,这样就不用在一开始的时候将它赋值为null。当你对一个全局变量使用了lateinit关键字时,请一定要确保它在被任何地方调用之前已经完成了初始化工作,否则Kotlin将无法......
  • 递归+回溯解决有效括号问题
    题目描述:数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合例如:当n=1时,有效的括号组合['()']当n=2时,有效的括号组合['(())','()()']当n=3时,有效的括号组合有['((()))','(()())','(())()'.'()(())','()()()&......
  • TheAlgorithms/C - 各种基础算法、数据结构的 C 语言实现+armink/SFUD - 一款基于 JED
    1、OpenMV-RT-基于恩智浦i.MXRT系列的开源机器视觉AI模块OpenMV-RT是一款基于恩智浦最近主打的i.MXRT超高性能系列MCU的视觉模块,模块设计者是恩智浦大牛工程师宋岩(对,就是ARMCortex-M3权威指南中文版作者)。模块源代码: https://github.com/RockySong/micropython......
  • 软件测评笔记04--操作系统
    编译原理高级语言源程序中的错误分为两类:语法错误和语义错误,其中语义错误可分为静态语义和动态语义错误语法错误:语言结构上的错误静态语义错误:编译时能发现的程序含义上的错误动态语义错误:只有程序运行时才能表现出来 程序编译过程过程:词法分析、语法分析、语义分析词法......
  • 分块 学习笔记
    什么是分块分块,顾名思义是一种将数据分成多块,以实现一些功能的算法。分块算法实质上是一种是通过将数据分成多块后在每块上打标记以实现快速区间修改,区间查询的一种算法。其均摊时间复杂度为\(O(\sqrt{n})\)分块的具体操作分块voidcreate(){ t=sqrt(n); for(inti=1;i<......
  • 1.1数据结构基本概念
    1.1数据结构基本概念什么是数据?数据是信息的载体,是描述客观事务属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合(二进制0和1)。数据事计算机程序加工的原料。数据元素、数据项数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元......