二叉树的层序遍历/后序遍历(leetcode104二叉树的最大深度、111二叉树的最小深度)(华为OD悄悄话、数组二叉树)

104二叉树的最大深度

给定一个二叉树 root ,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
在这里插入图片描述
本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。

二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)
而根节点的高度就是二叉树的最大深度,所以本题中我们通过后序求的根节点高度来求的二叉树最大深度。
我先用后序遍历(左右中)来计算树的高度。

1、确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回这棵树的深度,所以返回值为int类型。
代码如下:

int getdepth(TreeNode* node)
2、确定终止条件:如果为空节点的话,就返回0,表示高度为0。
代码如下:
```c
if (node == NULL) return 0;
3、确定单层递归的逻辑:先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。
代码如下:
`int leftdepth = getdepth(node->left);       // 左
int rightdepth = getdepth(node->right);     // 右
int depth = 1 + max(leftdepth, rightdepth); // 中
return depth;````int maxDepth(struct TreeNode* root) {if(root==NULL) return 0;int left=maxDepth(root->left);int right=maxDepth(root->right);return 1+fmax(left,right);
}                                       

111、二叉树的最小深度

给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
在这里插入图片描述

1 、递归法(后序遍历)

I、确定递归函数的参数和返回值
参数为要传入的二叉树根节点,返回的是int类型的深度。
代码如下:

int getDepth(TreeNode* node)
II、确定终止条件
终止条件也是遇到空节点返回0,表示当前节点的高度为0。
代码如下:```c
if (node == NULL) return 0;

III、确定单层递归的逻辑

int leftDepth = getDepth(node->left);           // 左
int rightDepth = getDepth(node->right);         // 右// 中
// 当一个左子树为空,右不为空,这时并不是最低点
if (node->left == NULL && node->right != NULL) { return 1 + rightDepth;
}   
// 当一个右子树为空,左不为空,这时并不是最低点
if (node->left != NULL && node->right == NULL) { return 1 + leftDepth;
}
int result = 1 + min(leftDepth, rightDepth);
return result;
int minDepth(struct TreeNode* root) {if(root==NULL) return 0;int left= minDepth(root->left);int right= minDepth(root->right);if(root->left==NULL&&root->right!=NULL)return 1+right;if(root->left!=NULL&&root->right==NULL)return 1+left;return 1+fmin(left,right);   
}

2、迭代法(层序遍历)

int minDepth(struct TreeNode* root) {struct TreeNode* q[10000];if(root==NULL) return 0;int depth=0;int l=0,r=0;q[r++]=root;//将根节点入栈while(l<r){depth++;int len=r-l;for(int i=0;i<len;i++){root=q[l++];//队头元素为根节点if(root->left==NULL&&root->right==NULL)return depth;if(root->left!=NULL)q[r++]=root->left;if(root->right!=NULL)q[r++]=root->right;}}return depth;
}

华为OD机试C卷(100分)-悄悄话

题目描述

给定一个二叉树,每个节点上站一个人,节点数字表示父节点到该节点传递悄悄话需要花费的时间。
初始时,根节点所在位置的人有一个悄悄话想要传递给其他人,求二叉树所有节点上的人都接收到悄悄话花费的时间。

输入描述

给定二叉树

0 9 20 -1 -1 15 7 -1 -1 -1 -1 3 2

注:-1表示空节点
在这里插入图片描述

输出描述

返回所有节点都接收到悄悄话花费的时间
38

用例

输入 0 9 20 -1 -1 15 7 -1 -1 -1 -1 3 2
输出 38
说明 无

题目解析

题目给的输入信息对照图示来看,应该就是二叉树的层序遍历序列,如下图所示:
在这里插入图片描述
层序遍历序列中,父子节点存在如下关系:
如果父节点在序列中的索引是k,则其两个子节点在序列中的索引分别为 2k+1, 2k+2
因此,我们就无需建树操作了。
而悄悄话的传递,其实父节点将自身得到消息的时延累加到其各个子节点上,最终叶子节点中最大的时延值就是:二叉树所有节点上的人都接收到悄悄话花费的时间
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
int getResult(int *times,int len){int ans=0;int queue[100];int front=0,rear=0;queue[rear++]=0;while(front<rear){int fa=queue[front++];int ch1=2*fa+1;int ch2=2*fa+2;int ch1_exist=ch1<len&&times[ch1]!=-1;int ch2_exist=ch2<len&&times[ch2]!=-1;if(ch1_exist){times[ch1]+=times[fa];queue[rear++]=ch1;}if(ch2_exist){times[ch2]+=times[fa];queue[rear++]=ch2;}if(!ch1_exist&&!ch2_exist){if(times[fa]>ans)ans=times[fa];}}return ans;
}
int main()
{int times[1000];int len=0;while(scanf("%d",&times[len++])){if(getchar()!=' ')break;}printf("%d\n",getResult(times,len));return 0;
}

华为OD机试(C卷,200分)- 数组二叉树

题目描述

二叉树也可以用数组来存储,给定一个数组,树的根节点的值存储在下标1,对于存储在下标N的节点,它的左子节点和右子节点分别存储在下标2N和2N+1,并且我们用值-1代表一个节点为空。
给定一个数组存储的二叉树,试求从根节点到最小的叶子节点的路径,路径由节点的值组成。

输入描述

输入一行为数组的内容,数组的每个元素都是正整数,元素间用空格分隔。
注意第一个元素即为根节点的值,即数组的第N个元素对应下标N,下标0在树的表示中没有使用,所以我们省略了。
输入的树最多为7层。

输出描述

输出从根节点到最小叶子节点的路径上,各个节点的值,由空格分隔,用例保证最小叶子节点只有一个。

用例

输入 3 5 7 -1 -1 2 4
输出 3 7 2
说明 最小叶子节点的路径为3 7 2。
输入 5 9 8 -1 -1 7 -1 -1 -1 -1 -1 6
输出 5 8 7 6
说明 最小叶子节点的路径为5 8 7 6,注意数组仅存储至最后一个非空节点,故不包含节点“7”右子节点的-1。

题目解析

本题有两种思路,一种是从树顶节点向下找,直到找到最小值节点。
这种方式是典型的深度优先搜索。
在这里插入图片描述
还有一种思路是先找到最小值节点,然后从最小值节点向上找父节点,由于向上找只有一个父节点,因此只有一种路径。
因此,我们应该选择这种方式。
在这里插入图片描述
采用这种方式,首先需要找到最小值节点在数组中的索引位置idx,然后根据题目定义的规则
对于存储在下标N的节点,它的左子节点和右子节点分别存储在下标2N和2N+1
当然上面这个规则是针对根节点索引从1开始的,如果根节点索引从0开始算法,则上面规则应变为
对于存储在下标N的节点,它的左子节点和右子节点分别存储在下标2N+1和2N+2
每找到一个父节点,就将其当成新的子节点,继续向上找父节点,直到子节点本身就是树顶节点为止。
另外,如何找到最小值叶子节点呢?
我们可以反向遍历输入的节点数组,如果遍历的节点符合下面条件,那么他就是一个叶子节点:
自身节点值不为-1
自身没有子节点(即既没有左子节点,也没有右子节点)

#include <stdio.h>
#include <limits.h>
#define MAXSIZE INT_MAX
char* getResult(int arr[], int size) {// 最小叶子节点的值int minV = MAXSIZE;// 最小节点在数组中的索引位置int minIdx = -1;int n = size - 1;for (int i = n; i > 0; i--) {if (arr[i] != -1) {if (i * 2 + 1 <= n && arr[i * 2 + 1] != -1) {continue;}if (i * 2 + 2 <= n && arr[i * 2 + 2] != -1) {continue;}if (minV > arr[i]) {minV = arr[i];minIdx = i;}}}// path 用于缓存最小叶子节点到根的路径char* path = (char*)malloc(100 * sizeof(char));int pathIndex = 0;char temp[10];sprintf(temp, "%d", minV);for (int i = 0; temp[i] != '\0'; i++) {path[pathIndex++] = temp[i];path[pathIndex++] = ' ';}// 从最小值节点开始向上找父节点,直到树顶while (minIdx != 0) {int f = (minIdx - 1) / 2;sprintf(temp, "%d", arr[f]);for (int i = 0; temp[i] != '\0'; i++) {path[pathIndex++] = temp[i];}path[pathIndex++] = ' ';minIdx = f;}path[pathIndex] = '\0';return path;
}
void reverseString(char* str) {int length = strlen(str)-1;for (int i = 0; i < length / 2; i++) {char temp = str[i];str[i] = str[length - i - 1];str[length - i - 1] = temp;}
}
int main() {// 输入数组int arr[1000];int n=0;while(scanf("%d",&arr[n++])){if(getchar()!=' ')break;}// 调用算法函数char* result =getResult(arr, n);reverseString(result);// 输出结果printf("%s\n", result);// 释放内存free(result);return 0;
}

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

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

相关文章

基于SpringBoot学生信息管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

昇思MindSpore学习笔记5--数据变换Transforms

摘要&#xff1a; 昇思MindSpore的数据变换&#xff0c;包括通用变换Common Transforms、图像变换Vision Transforms、标准化Normalize、文本变换Text Transforms、匿名函数变换Lambda Transforms。 一、数据变换Transforms概念 原始数据需预处理后才能送入神经网络进行训练…

下一代的JDK - GraalVM

GraalVM是最近几年Java相关的新技术领域不多的亮点之一&#xff0c; 被称之为革命性的下一代JDK&#xff0c;那么它究竟有什么神奇之处&#xff0c;又为当前的Java开发带来了一些什么样的改变呢&#xff0c;让我们来详细了解下 下一代的JDK 官网对GraalVM的介绍是 “GraalVM 是…

【大数据开发语言Scala的入门教程】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

Python现在可以在线编程了!

你好&#xff0c;我是郭震 1 在线编程 在线编程好处&#xff1a; 1 无需安装和配置环境: 在线编程平台不需要用户在本地安装任何软件或配置开发环境。这对初学者和那些希望快速上手进行编程的人非常有利。 2 跨平台兼容性: 这些平台可以在任何具有互联网连接的设备上使用&#…

Flutter循序渐进==>Dart之类型、控制流和循环

导言 磨刀不误砍柴工&#xff0c;想搞好Flutter&#xff0c;先学好Flutter&#xff0c;还是本着我学Python的方法&#xff0c;先从数据类型、控制流和循环开始&#xff0c;这是每一种编程语言必用的。编程语言是相通的&#xff0c;基本精通一种后&#xff0c;学其它的就变得很…

捡到AI系统,金曲创作全靠玩

前言 毫无疑问,AI的发展已经在音乐领域带来了诸多变化和影响.但人类创作仍然具有不可替代的重要性。人类的灵感、创造力以及对音乐的深刻理解和情感表达是音乐产业的核心动力来源。AI 更倾向于被视为一种辅助工具&#xff0c;与人类创作者相互协作和融合&#xff0c;共同推动音…

laravel Dcat Admin 入门应用(七)列copyable和自定义copy

laravel Dcat Admin 入门应用&#xff08;七&#xff09;列copyable和自定义copy Dcat Admin 是一个基于 Laravel-admin 二次开发而成的后台构建工具&#xff0c;只需很少的代码即可构建出一个功能完善的高颜值后台系统。支持页面一键生成 CURD 代码&#xff0c;内置丰富的后台…

【机器学习300问】136、C4.5虽然改善了ID3决策树算法的部分缺点,但还是有不足,请问还有更好的算法吗?CART算法构建决策树

一、C4.5算法仍存在的不足 &#xff08;1&#xff09;计算效率不高 C4.5使用的信息增益率计算涉及熵的对数计算&#xff0c;特别是当属性值数量大时&#xff0c;计算成本较高。 &#xff08;2&#xff09;处理连续数值属性不够高效 ID3算法只能处理离散属性&#xff0c;需要预…

kafka学习笔记08

Springboot项目整合spring-kafka依赖包配置 有这种方式&#xff0c;就是可以是把之前test里的配置在这写上&#xff0c;用Bean注解上。 现在来介绍第二种方式&#xff1a; 1.添加kafka依赖&#xff1a; 2.添加kafka配置方式: 编写代码发送消息&#xff1a; 测试&#xff1a; …

c++11、14多线程从原理到线程池

c11、14多线程从原理到线程池 一.初识二.std::thread对象生命周期和线程等待与分离1.主线程不退出&#xff0c;thread对象被销毁&#xff0c;子线程仍然在运行。2.主线程阻塞&#xff0c;等待子线程退出3.子线程与主线程分离&#xff08;守护线程&#xff09; 三.线程创建的多种…

Nuxtjs3教程

起步 官方文档 官方目录结构 安装 npx nuxi@latest init <project-name>后面跟着提示走就行 最后yarn run dev 启动项目访问localhost:3000即可 路由组件 app.vue为项目根组件 <nuxt-page />为路由显示入口 将app.vue更改内容如下 <template><d…

C语言的数据结构:树与二叉树(哈夫曼树篇)

前言 上篇讲完了二叉树&#xff0c;二叉树的查找性能要比树好很多&#xff0c;如平衡二叉树保证左右两边节点层级相差不会大于1&#xff0c;其查找的时间复杂度仅为 l o g 2 n log_2n log2​n&#xff0c;在两边层级相同时&#xff0c;其查找速度接近于二分查找。1w条数据&am…

什么是中断?---STM32篇

目录 一&#xff0c;中断的概念 二&#xff0c;中断的意义 三&#xff0c;中断的优先级 四&#xff0c;中断的嵌套 如果一个高优先级的中断发生&#xff0c;它会立即打断当前正在处理的中断&#xff08;如果其优先级较低&#xff09;&#xff0c;并首先处理这个高优…

uniapp+php开发的全开源多端微商城完整系统源码.

uniappphp开发的全开源多端微商城完整系统源码. 全开源的基础商城销售功能的开源微商城。前端基于 uni-app&#xff0c;一端发布多端通用。 目前已经适配 H5、微信小程序、QQ小程序、Ios App、Android App。 采用该资源包做商城项目&#xff0c;可以节省大量的开发时间。 这…

周边美食小程序系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;美食店铺管理&#xff0c;菜品分类管理&#xff0c;标签管理&#xff0c;菜品信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;美食店铺&#…

基于SSM+Jsp的疫情居家办公OA系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

20-OWASP top10--XXS跨站脚本攻击

目录 什么是xxs&#xff1f; XSS漏洞出现的原因 XSS分类 反射型XSS 储存型XSS DOM型 XSS XSS漏洞复现 XSS的危害或能做什么&#xff1f; 劫持用户cookie 钓鱼登录 XSS获取键盘记录 同源策略 &#xff08;1&#xff09;什么是跨域 &#xff08;2&#xff09;同源策略…

容易涨粉的视频素材有哪些?容易涨粉的爆款短素材库网站分享

如何挑选社交媒体视频素材&#xff1a;顶级视频库推荐 在社交媒体上脱颖而出&#xff0c;视频素材的选择至关重要。以下是一些顶级的视频素材网站推荐&#xff0c;不仅可以提升视频质量&#xff0c;还能帮助你吸引更多粉丝。 蛙学网&#xff1a;创意的源泉 作为创意和独特性的…

Databend db-archiver 数据归档压测报告

Databend db-archiver 数据归档压测报告 背景准备工作Create target databend table启动 small warehouse准备北京区阿里云 ECSdb-archiver 的配置文件准备一亿条源表数据开始压测 背景 本次压测目标为使用 db-archiver 从 MySQL 归档数据到 Databend Cloud&#xff0c; 归档的…