训练营day16

news/2024/4/29 18:46:17/文章来源:https://blog.csdn.net/pipi_lovelygirl/article/details/128945375

  • 104.二叉树的最大深度 559.n叉树的最大深度
  • 111.二叉树的最小深度
  • 222.完全二叉树的节点个数

104.二叉树的最大深度

力扣题目链接

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例: 给定二叉树 [3,9,20,null,null,15,7],

 

 104. 二叉树的最大深度

 返回它的最大深度 3 。

 

var maxDepth = function(root) {if(root == null) return 0;return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
};
var root = {val: 3, left: {val: 9,left: null,right: null},right: {val: 20,left: {val: 15,left: null,right: null},right: {val: 7,left: null,right: null}}
}
console.log(maxDepth(root));

递归法

本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。

  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数后者节点数(取决于高度从0开始还是从1开始)

而根节点的高度就是二叉树的最大深度,所以本题中我们通过后序求的根节点高度来求的二叉树最大深度。

我先用后序遍历(左右中)来计算树的高度。


// 代码随想录
var maxdepth = function(root) {if (root === null) return 0;return 1 + Math.max(maxdepth(root.left), maxdepth(root.right))
};
// 二叉树最大深度递归遍历
var maxdepth = function(root) {//使用递归的方法 递归三部曲//1. 确定递归函数的参数和返回值const getdepth = function(node) {//2. 确定终止条件if(node === null) {return 0;}//3. 确定单层逻辑let leftdepth = getdepth(node.left);let rightdepth = getdepth(node.right);let depth = 1 + Math.max(leftdepth, rightdepth);return depth;}return getdepth(root);
};

迭代法

使用迭代法的话,使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数,和层序遍历的方式极其吻合。

在二叉树中,一层一层的来遍历二叉树,记录一下遍历的层数就是二叉树的深度,如图所示:

层序遍历

所以这道题的迭代法就是一道模板题,可以使用二叉树层序遍历的模板来解决的。

如果对层序遍历还不清楚的话,可以看这篇:二叉树:层序遍历登场!

 

// 二叉树最大深度层级遍历
var maxDepth = function(root) {if(!root) return 0let count = 0const queue = [root]while(queue.length) {let size = queue.length/* 层数+1 */count++while(size--) {let node = queue.shift();node.left && queue.push(node.left);node.right && queue.push(node.right);}}return count
};

 

559.n叉树的最大深度

力扣题目链接

给定一个 n 叉树,找到其最大深度。

最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。

例如,给定一个 3叉树 :

 

559.n叉树的最大深度 

 

我们应返回其最大深度,3。

思路:

依然可以提供递归法和迭代法,来解决这个问题,思路是和二叉树思路一样的,直接给出代码如下:

// 559.n叉树的最大深度
// N叉树的最大深度 递归写法
var maxDepth = function(root) {if(!root) return 0let depth = 0for(let node of root.children) {depth = Math.max(depth, maxDepth(node))}return depth + 1
}
// N叉树的最大深度 层序遍历
var maxDepth = function(root) {if(!root) return 0let count = 0let queue = [root]while(queue.length) {let size = queue.lengthcount++while(size--) {let node = queue.shift()for (let item of node.children) {item && queue.push(item);}}}return count
};

 

111.二叉树的最小深度

力扣题目链接

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明: 叶子节点是指没有子节点的节点。

示例:

给定二叉树 [3,9,20,null,null,15,7],

111.二叉树的最小深度1 

 111.二叉树的最小深度

 

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。,注意是叶子节点

什么是叶子节点,左右孩子都为空的节点才是叶子节点!

var minDepth=function(root){if(root===null) return 0;if(root.left===null&&root.right===null) return 1;let min_depth=Number.MAX_SAFE_INTEGER;if(root.left!==null){min_depth=Math.min(minDepth(root.left),min_depth);}if(root.right!==null){min_depth=Math.min(minDepth(root.right),min_depth);}return min_depth+1;
}

#递归法

  1. 确定递归函数的参数和返回值 参数为要传入的二叉树根节点,返回的是int类型的深度。
  2. 确定终止条件   终止条件也是遇到空节点返回0,表示当前节点的高度为0。
  3. 确定单层递归的逻辑
var minDepth1 = function(root) {if(!root) return 0;// 到叶子节点 返回 1if(!root.left && !root.right) return 1;// 只有右节点时 递归右节点if(!root.left) return 1 + minDepth(root.right);// 只有左节点时 递归左节点if(!root.right) return 1 + minDepth(root.left);return Math.min(minDepth(root.left), minDepth(root.right)) + 1;
};
// 迭代法
/**
* @param {TreeNode} root
* @return {number}
*/
var minDepth = function(root) {if(!root) return 0;const queue = [root];let dep = 0;// 队列不为空时while(queue.length) {let size = queue.length;dep++;while(size--){const node = queue.shift();// 到第一个叶子节点 返回 当前深度 if(!node.left && !node.right) return dep;node.left && queue.push(node.left);node.right && queue.push(node.right);}}
};

222.完全二叉树的节点个数

力扣题目链接

给出一个完全二叉树,求出该树的节点个数。

示例 1:

  • 输入:root = [1,2,3,4,5,6]
  • 输出:6

示例 2:

  • 输入:root = []
  • 输出:0

示例 3:

  • 输入:root = [1]
  • 输出:1

提示:

  • 树中节点的数目范围是[0, 5 * 10^4]
  • 0 <= Node.val <= 5 * 10^4
  • 题目数据保证输入的树是 完全二叉树

#思路

 

var countNodes = function(root) {if(root===null) return 0;return 1+countNodes(root.left)+countNodes(root.right);
};
//代码随想录
// 递归版本
var countNodes = function(root) {//递归法计算二叉树节点数// 1. 确定递归函数参数const getNodeSum = function(node) {//2. 确定终止条件if(node === null) {return 0;}//3. 确定单层递归逻辑let leftNum = getNodeSum(node.left);let rightNum = getNodeSum(node.right);return leftNum + rightNum + 1;}return getNodeSum(root);
};
// 迭代(层序遍历)版本
var countNodes = function(root) {//层序遍历let queue = [];if(root === null) {return 0;}queue.push(root);let nodeNums = 0;while(queue.length) {let length = queue.length;while(length--) {let node = queue.shift();nodeNums++;node.left && queue.push(node.left);node.right && queue.push(node.right);}}return nodeNums;
};
// 利用完全二叉树性质
var countNodes = function(root) {//利用完全二叉树的特点if(root === null) {return 0;}let left = root.left;let right = root.right;let leftDepth = 0, rightDepth = 0;while(left) {left = left.left;leftDepth++;}while(right) {right = right.right;rightDepth++;}if(leftDepth == rightDepth) {return Math.pow(2, leftDepth+1) - 1;}return countNodes(root.left) + countNodes(root.right) + 1;
};  

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

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

相关文章

Java基础-网络编程

1. 网络编程入门 1.1 网络编程概述 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统…

Vue中路由缓存及activated与deactivated的详解

目录前言一&#xff0c;路由缓存1.1 引子1.2 路由缓存的方法1.2.1 keep-alive1.2.2 keep-alive标签中的include属性1.2.3 include中多组件的配置二&#xff0c;activated与deactivated2.1 引子2.2 介绍activated与deactivated2.3 解决需求三&#xff0c;整体代码总结前言 在Vu…

【深度学习基础8】卷积神经网络 经典网络

一、卷积操作 1. 基本原理 相信大家对卷积操作并不陌生,先来回顾一下卷积的工作原理(2-D):👇 卷积的目的是进行特征提取,不同的卷积核可以提取到不同的特征,比如下面的三个卷积核的功能分别是:模糊化、锐化、边缘化👇 卷积的本质就是滤波器, 将滤波器沿着图像…

【JavaScript】面向对象和构造函数详解

&#x1f4bb; 【JavaScript】面向对象和构造函数详解 &#x1f3e0;专栏&#xff1a;JavaScript &#x1f440;个人主页&#xff1a;繁星学编程&#x1f341; &#x1f9d1;个人简介&#xff1a;一个不断提高自我的平凡人&#x1f680; &#x1f50a;分享方向&#xff1a;目前…

加拿大访问学者家属如何办理探亲签证?

由于大多数访问学者的访学期限都为一年&#xff0c;家人来访不仅可以缓解访学的寂寞生活&#xff0c;而且也是家人到加拿大体验国外风情的好机会。家属在国内申请赴加签证时&#xff0c;如果材料齐全&#xff0c;一般上午递交了申请&#xff0c;下午就可以拿到签证。以下是家人…

基于merlin使用chatGPT进行对话

最近chatGPT很热&#xff0c;大家都想试用它。但由于各种限制&#xff0c;一般情况下国内不能试用。 下面给大家介绍基于merlin使用chatGPT&#xff08;目前每天只有11次问答次数&#xff09;。 1 打开merlin页面 访问地址merlin.foyer.work&#xff0c;点击“add to chrome”…

流程控制之循环

文章目录五、流程控制之循环5.1 步进循环语句for5.1.1 带列表的for循环语句5.1.2 不带列表的for循环语句5.1.3 类C风格的for循环语句5.2 while循环语句5.2.1 while循环读取文件5.2.2 while循环语句示例5.3 until循环语句5.4 select循环语句5.5 嵌套循环5.4 利用break和continue…

Elasticsearch安装IK分词器、配置自定义分词词库

一、分词简介 在Elasticsearch中&#xff0c;假设搜索条件是“华为手机平板电脑”&#xff0c;要求是只要满足了其中任意一个词语组合的数据都要查询出来。借助 Elasticseach 的文本分析功能可以轻松将搜索条件进行分词处理&#xff0c;再结合倒排索引实现快速检索。Elasticse…

crawler爬虫抓取数据

crawler爬虫实现 学习目标&#xff1a; 了解 crawler爬虫运行流程了解 crawler爬虫模块实现 1. crawler功能 初始化driver输入公司名称,并点击判断是否需要验证如果需要验证&#xff0c;获取验证图片并保存获取打码坐标点击验证图片判断查询结果选择第一条查询结果获取主要信…

Vue2仿网易云风格音乐播放器(附源码)

Vue2仿网易云风格音乐播放器1、整体效果2、使用技术3、实现内容4、源码5、使用图片1、整体效果 2、使用技术 使用了HTML5 CSS3进行页面布局及美化使用Vue2进行数据渲染与页面交互使用Axios发送http请求获取数据 3、实现内容 实现了搜索歌曲功能&#xff0c;输入歌手或歌曲关…

2023年做跨境电商的4个小忠告

2023年做跨境电商的小伙伴日益增加&#xff0c;但不管是对于新手还是老人&#xff0c;都是一个极具挑战的事情&#xff0c;因为做好跨境电商不是一件容易的事情&#xff0c;需要花费不少时间与精力。这里我们小编就给大家几个小忠告&#xff0c;希望对大家有用。2023年做跨境电…

私募证券基金动态-23年1月报

成交量&#xff1a;1月日均7,901.31亿元2023年1月A股两市日均成交7,901.31亿元&#xff0c;环比上升0.33%、同比下降25.18%。1月恰逢春节仅16个交易日&#xff0c;节后2个交易日交易量明显回暖。管理人&#xff1a;新提交备案51家&#xff0c;备案通过21家1月新提交备案申请的5…

侯捷C++系统工程师

前言我相信对于每一个学习C的同学和从业者来说&#xff0c;台湾著名学者侯捷老师的C系列都是不可错过的好视频。侯捷老师在网上已有五门课&#xff0c;分别是&#xff1a;C面向对象开发、STL标准库与泛型编程、C新标准C1&14、C内存管理机制以及C Startup揭秘讲师介绍侯捷老…

当下最流行的 ChatGPT :前世今生

GPT 不是凭空而出&#xff0c;它是经过了很多人的努力&#xff0c;以及很长一段时间的演化得来的。因此&#xff0c;梳理一下 GPT 的庞大 “家族” 还是很有必要的&#xff0c;看看他继承了什么&#xff0c;学习了什么&#xff0c;又改进了什么&#xff0c;这样也能更好地理解 …

微店商品详情API

一、微店的定义&#xff1a; 随着移动互联网应用微信的崛起&#xff0c;微商生态随着移动电商领域兴起&#xff0c;作为承载微商的平台微店就此产生。所谓“微店”&#xff0c;本质上就是提供让微商玩家入驻的平台&#xff0c;有点类似PC端建站的工具&#xff0c;其不同于移动…

设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)

工厂模式 Factory Pattern&#xff08;简单工厂、工厂方法、抽象工厂&#xff09; 工厂模式-创建型模式-提供了创建对象的最佳方式。 在工厂模式中&#xff0c;创建对象时不会对客户端暴露创建逻辑&#xff0c;并且是通过一个共同的接口来创建新的对象。 简单工厂 简单工厂…

小兔子MQ高级

一.保证消息被执行处理传递逻辑&#xff1a;生产者消息确认RabbitMQ提供了publisher confirm机制来避免消息发送到MQ过程中丢失。这种机制必须给每个消息指定一个唯一ID(一般是业务id)。消息发送到MQ以后&#xff0c;会返回一个结果给发送者&#xff0c;表示消息是否处理成功。…

从FPGA说起的深度学习(二)

这是新的系列教程&#xff0c;在本教程中&#xff0c;我们将介绍使用 FPGA 实现深度学习的技术&#xff0c;深度学习是近年来人工智能领域的热门话题。在本教程中&#xff0c;旨在加深对深度学习和 FPGA 的理解。用 C/C 编写深度学习推理代码高级综合 (HLS) 将 C/C 代码转换为硬…

真的麻了,别再为难软件测试员了......

前言 有不少技术友在测试群里讨论&#xff0c;近期的面试越来越难了&#xff0c;要背的八股文越来越多了,考察得越来越细&#xff0c;越来越底层&#xff0c;明摆着就是想让我们徒手造航母嘛&#xff01;实在是太为难我们这些测试工程师了。 这不&#xff0c;为了帮大家节约时…

无需注册即可免费使用ChatGPT

无需注册即可免费使用ChatGPT 最近OpenAI的ChatGPT异常火爆&#xff0c;有很多人都想尝试尝试&#xff0c;但是因为一些原因折戟&#xff0c;这里提供一个免注册的体验方法&#xff0c;仅供学习交流。 一&#xff0c;首先下载vscode 官网下载地址 Visual Studio Code - Code…