算法打卡Day14

今日任务:

1)104.二叉树的最大深度

2)559.n叉树的最大深度

3)111.二叉树的最小深度

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

104.二叉树的最大深度

题目链接:104. 二叉树的最大深度 - 力扣(LeetCode)

给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

文章讲解:代码随想录 (programmercarl.com)

视频讲解:二叉树的高度和深度有啥区别?究竟用什么遍历顺序?很多录友搞不懂 | LeetCode:104.二叉树的最大深度哔哩哔哩bilibili

思路:

这道题已经在前一篇文章算法打卡day13层序遍历中做过了,如果采用迭代的方法,就用层序遍历,这题比较简单,遍历完所有节点,每遍历一层深度加一即可

今天采用递归(后序遍历)的方法来做,也可以用前序遍历来做(前序遍历涉及到回溯,我还不理解,等后序二刷再来研究),前序遍历求的就是深度,后序遍历求的是高度

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

其实弄懂这两个概念,就会发现,在此题求二叉树最大深度中,高度与深度可与转换,当我求二叉树最大深度,也就是最底层叶子节点的深度,也就根节点的高度,所以我们求二叉树最大深度可以转换为,求根节点的高度

求高度我们用后序遍历(左右中),后序遍历是找到叶子节点,然后按左右中每次往上遍历,到时,需要取左数与右树的最大深度

class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass Solution:# 递归(后序)def maxDepth(self, root: [TreeNode]) -> int:return self.getHeight(root)def getHeight(self,node):if not node:return 0leftDepth = self.getHeight(node.left)  # 左rightDepth = self.getHeight(node.right)  # 右height = 1 + max(leftDepth, rightDepth)  # 中return height

感想:

这题想清楚了就比较简单,最直截了当的就是层序遍历,递归的方法不好想一点,做之前可能要区分高度与深度,但做完就能跳出深度与高度的概念,后序从下网上,就是从下开始计数,前序从上往下遍历,就是从上开始计数

559.n叉树的最大深度

题目链接:559. N 叉树的最大深度 - 力扣(LeetCode)

给定一个 n 叉树,找到其最大深度。 最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。

文章讲解:代码随想录 (programmercarl.com)

思路:

如果采用迭代,层次遍历,这题与上一题一样只是左右节点换成孩子节点了,其他一样

这题如果采用递归的方法,我们也是采用后序遍历

求二叉树深度,我们只需要求出左右树的深度,然后比较,取最大。但是在N叉树中,我们不知道有几个子树,我们需要遍历子树,并用变量记录最大高度,每求一棵树的高度,变与变量比较,将大值重新赋给变量

class Node:def __init__(self, val=None, children=None):self.val = valself.children = childrenclass Solution:def maxDepth(self, root: Node) -> int:return self.getHeight(root)def getHeight(self,node: Node):if not node:return 0height = 0for child in node.children:height = max(height,self.getHeight(child))return height + 1

111.二叉树的最小深度

题目链接:111. 二叉树的最小深度 - 力扣(LeetCode)

给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。 这题在02二叉树的层序遍历中做过,采用的层次遍历

文章讲解:代码随想录 (programmercarl.com)

视频讲解:看起来好像做过,一写就错! | LeetCode:111.二叉树的最小深度哔哩哔哩bilibili

思路:

做了前面几题,这题思路比较好像,递归后序遍历,取左右子树的最小高度即可,但这里面有个坑

最小深度是要找根节点到最近叶子节点的距离,注意是叶子节点,也就就是得遇到左右节点均为空才算遇到了叶子节点

class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass Solution:def minDepth(self, root: [TreeNode]) -> int:return self.getDepth(root)def getDepth(self, node):# 排除左右节点均为空if not node:return 0leftDepth = self.getDepth(node.left)rightDepth = self.getDepth(node.right)# 注意,叶子节点是需要左右都为空才为叶子节点if node.left == None and node.right:depth = rightDepth + 1elif node.right == None and node.left:depth = leftDepth + 1# 现在还剩左右均不为空的情况else:depth = 1+ min(rightDepth,leftDepth)return depth

感想:

以上这两题得递归我写的比较复杂,但是好理解,所以没有放上精简版,如果后面自己熟练了二叉树递归,我在补充上精简版

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

题目链接:222. 完全二叉树的节点个数 - 力扣(LeetCode)

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

示例 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
题目数据保证输入的树是 完全二叉树

文章讲解:代码随想录 (programmercarl.com)

视频讲解:要理解普通二叉树和完全二叉树的区别! | LeetCode:222.完全二叉树节点的数量哔哩哔哩bilibili

二叉树求节点个数统一思路:

这题有两个思路,不管什么二叉树求节点个数,我们可以用迭代层序遍历,或者递归后序遍历,遍历完计数即可,这样会把每个节点遍历一遍

  • 时间复杂度:O(n)
  • 空间复杂度:O(log n)
lass TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass Solution:# 一般二叉树求解方法def countNodes(self, root: [TreeNode]) -> int:return self.getNum(root)def getNum(self,node):if not node:return 0leftNum = self.getNum(node.left)rightNum = self.getNum(node.right)totalNode = leftNum + rightNum + 1return totalNode

完全二叉树求节点个数思路

对于完全二叉树,我们的遍历过程可以简化,不用遍历所有节点,我们只需要找出二叉树中的满二叉树,满二叉树知道其深度k,可以利用公式2^k-1得到节点个数

  • 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。

        

  • 满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。

        

完全二叉树只有两种情况,情况一:就是满二叉树,情况二:最后一层叶子节点没有满。

如果是满二叉树,直接求节点,如果不是,则需要分别递归左孩子,和右孩子,递归到某一深度一定会有左孩子或者右孩子为满二叉树,然后依然可以按照情况1来计算。

那么如何判断某个树是不是满二叉树

我们只需要判断树的左右最外层是否相等

如,这一种就不等

继续往下找

左边已经找到,计算节点即可,右边继续

class TreeNode:def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = rightclass Solution:# 一般二叉树求解方法def countNodes(self, root: [TreeNode]) -> int:return self.getNum(root)def getNum(self,node):if not node:return 0left = node.leftleftDepth = 1right = node.rightrightDepth = 1# 求左子树深度while left:left = left.leftleftDepth += 1# 求右子树深度while right:right = right.rightrightDepth += 1if leftDepth == rightDepth:return 2**leftDepth - 1return self.getNum(node.left) + self.getNum(node.right) + 1

感想:

这题需要自己多画画图,搞清楚完全二叉树概念,下次碰到,不能想到,就用最直接的二叉树统一方法,能够做出来是第一步,优化是第二步

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

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

相关文章

Leetcode 70.爬楼梯

心路历程&#xff1a; 这道题是之前学院的一道复试题&#xff0c;大家都没怎么刷过算法题&#xff0c;只记得当年凭借几次试错自己把这道题做出来了&#xff0c;当时也不知道动态规划之类的。 正常来讲&#xff0c;这种找不到循环结构的题一般都是递归解决。 注意的点&#x…

C语言经典面试题目(二十八)

1、解释一下C语言中的do-while循环语句。 do-while循环语句是C语言中的一种循环结构&#xff0c;它与while循环相似&#xff0c;不同之处在于条件判断的时机。do-while循环先执行循环体&#xff0c;然后再判断条件是否成立&#xff0c;如果条件成立&#xff0c;则继续执行循环…

Linux学习笔记16 - 系统命令

1. Linux 常见系统管理命令 命令含义格式su切换用户su [选项] [用户名]ps显示系统由该用户运行的进程列表ps [选项]top动态显示系统中运行的程序&#xff08;一般为每隔 5s&#xff09;topkill输出特定的信号给指定 PID&#xff08;进程号&#xff09;的进程&#xff0c;并根据…

鸿蒙开发实例【使用高德地图鸿蒙SDK】(一)

概述 地图SDK适配鸿蒙NEXT特性介绍 赋能开发者-提供地图鸿蒙原生ArkTS开发接口 开发者可以使用鸿蒙NEXT推荐的ArkTS接口开发应用集成地图功能&#xff0c;组件使用ArkUI原生组件&#xff0c;兼容方舟UI框架代码全面适配鸿蒙NEXTSDK&#xff0c;所有系统接口均使用鸿蒙NEXTAP…

Kerberos 5安装与使用

目录 简介 实验准备 实验步骤 一、安装Kerberos相关服务并建立集群所有节点互信(node1、2、3) 二、修改配置文件 三、 修改管理员权限配置文件(仅node1) 四、初始化KDC数据库(仅node1) 五、启动Kerberos相关服务(仅node1) 六、创建Kerberos管理员用户(仅node1…

编程题:最长的顺子(Java)

题目描述 斗地主起源于湖北十堰房县&#xff0c;据说是一位叫吴修全的年轻人根据当地流行的扑克玩法“跑得快”改编的&#xff0c;如今已风靡整个中国&#xff0c;并流行于互联网上。 牌型&#xff1a; 单顺&#xff0c;又称顺子&#xff0c;最少5张牌&#xff0c;最多12张牌…

在面对一个大型的代码,需要分文件编写的时候,应该怎么办呢;以及在编写出一个功能时,有人想要买这个功能,怎么在不给出源代码的情况下让买家可以使用这个代码功能呢?

我们一点点来&#xff0c;首先&#xff0c;假设我们要写一个加法功能的实现&#xff0c; 这里是在单个文件里调用函数&#xff0c;实现一个加法的功能&#xff0c; 下面我们把自定义函数放在下面&#xff0c;上面对自定义函数进行一个声明&#xff0c; 下面我们把代码放到多个…

【分享】3种方法保护Excel文件不能随意打开

做好的Excel表格不想被他人随意打开&#xff1f;那就一定要看看下面小编分享的3种方法&#xff0c;看看如何禁止打开Excel表格。 方法一&#xff1a;设置密码保护 我们可以给Excel表格设置“打开密码”&#xff0c;这样只有输入正确的密码&#xff0c;才能打开表格。 设置步骤…

java动态规划学习笔记

学习笔记目录&#xff0c;这里记录个大纲&#xff0c;详情点链接 背包问题 01背包问题综述 01背包问题&#xff08;二维数组&#xff09;https://blog.csdn.net/m0_73065928/article/details/136794406?spm1001.2014.3001.5501 01背包问题&#xff08;滚动数组&#xff09…

S32 Design Studio 中断

中断向量表 中断数量可以在规格书里面看&#xff0c;也可以在SDK\platform\devices\S32K146\include\S32Kxxx.h里面看。 譬如我这个146芯片就有151个中断号 /** Interrupt Number Definitions */ #define NUMBER_OF_INT_VECTORS 151u /**< Number of inter…

Java基础知识总结(13)

数据结构 链表 优点&#xff1a;随机增删元素效率高&#xff08;因为增删元素不涉及到大量元素的位移&#xff09; 缺点&#xff1a;查询效率较低&#xff0c;每一次查找某个元素的时候都需要从头结点开始往下遍历 LinkedList集合 /* 链表的优点&#xff1a; 由于链表的元…

MySQL常用的聚合函数(比较常用滴~)

① 常用的聚合函数 count(col): 表示求指定列的总行数 max(col): 表示求指定列的最大值 min(col): 表示求指定列的最小值 sum(col): 表示求指定列的和 avg(col): 表示求指定列的平均值 ② 求总行数 – 返回非NULL数据的总行数 select count(height) from students; –…

OpenHarmony游戏应用程序-实现的一个手柄游戏

介绍 本篇Codelab是基于TS扩展的声明式开发范式编程语言&#xff0c;以及OpenHarmony的分布式能力实现的一个手柄游戏。 说明&#xff1a; 本示例涉及使用系统接口&#xff0c;需要手动替换Full SDK才能编译通过。 完成本篇Codelab需要两台开发板&#xff0c;一台开发板作为游…

C/C++一些重要的关键字

一、static关键字 1、修饰局部变量–静态局部变量 特点&#xff1a; 1.1、static修饰局部变量&#xff0c;会影响局部变量的生命周期&#xff0c;本质改变了局部变量的储存位置&#xff0c;生命周期变长&#xff0c;为整个周期&#xff0c;其作用域还是局部&#xff0c;静态…

6 修改主机名和HOSTS文件

后期我们会配置多台服务器&#xff0c;那么每台服务器我们都会给定一个主机名&#xff0c;方便后期通过主机名进行访问。主机名的修改我们可以在安装操作系统时对其修改&#xff0c;如果忘记了&#xff0c;就可以修改配置文件完成&#xff0c;像后期我们进行虚拟机克隆后&#…

(一)基于IDEA的JAVA基础5

Scanner的使用 使用scanner可以接收键盘上输入的数据&#xff0c; Scanner inputnew Scanner(System.in)&#xff1b; 导包的方式: 什么是导包&#xff0c;导入的是jdk提供的java开发工具包&#xff0c;我们建一个java文件&#xff0c;psvm快捷输入后&#xff0c;打上new S…

海边游艇港口迈入智能新纪元:数字孪生系统引领未来趋势

在浩瀚的海洋边&#xff0c;游艇港口不仅是停泊游艇的港湾&#xff0c;更是展现城市风貌与智慧科技的窗口。如今&#xff0c;随着数字化技术的飞速发展&#xff0c;海边游艇港口也迎来了前所未有的变革——数字孪生系统的应用&#xff0c;正悄然改变着传统游艇港口的运营模式&a…

C语言例3-33:从键盘输入一个正整数保存至int 型变量 num,输出由8~11构成的数(从低位、0号开始编号)

算法分析&#xff1a; 使变量num右移8位&#xff0c;将原来的8~11位移到低4位上构造一个低4位为1&#xff0c;其余位为0的整数&#xff08;0000 0000 0000 1111&#xff09;与变量num进行按位与运算 代码如下&#xff1a; #include<stdio.h> int main(void) {int num,…

js实现读取excel文件

1、引入js文件&#xff0c;如下 <script src"https://code.jquery.com/jquery-2.2.4.js"></script> <script src"https://cdn.bootcss.com/xlsx/0.15.1/xlsx.core.min.js"></script> 2、判断文件是否是excel文件 var url$(#exc…

复试专业前沿问题问答合集9——密码学

复试专业前沿问题问答合集9——密码学 网络安全中的密码学加密算法原理及基础知识问答: Q1: 对称加密算法是如何工作的? A1: 对称加密算法使用相同的密钥进行数据的加密和解密。这种加密方式的关键在于密钥的保密,因为任何拥有密钥的人都可以解密信息。对称加密算法速度快…