【力扣打卡系列】二叉树·灵活运用递归

坚持按题型打卡&刷&梳理力扣算法题系列,语言为go,Day16

相同的树
  • 题目描述
    在这里插入图片描述
  • 解题思路
    • 边界条件,其中一个节点为空,return 只有p和q均为空才返回true,因此可以简写为p==q
    • return,先判断节点值是否一样,然后递归判断左子树是否一样,然后递归判断右子树是否一样
  • 代码参考
/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
func isSameTree(p *TreeNode, q *TreeNode) bool {if p == nil || q == nil{ // 只要有一个为空就returnreturn p == q}return p.Val == q.Val && isSameTree(p.Left,q.Left) && isSameTree(p.Right,q.Right)
}
  • tips
    • 注意空节点的return条件,只要左或者右有一个为空就返回,p和q必须都是nil才能返回true
    • 比较的时候,需要同时比较p和q的左子树,以及p和q的右子树
对称二叉树
  • 题目描述
    在这里插入图片描述
  • 解题思路
    • 在上一题的基础上稍加改动
  • 代码参考
/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/func isSameTree(p *TreeNode, q *TreeNode) bool{if p==nil || q==nil{return p==q}return p.Val == q.Val && isSameTree(p.Left,q.Right) && isSameTree(p.Right,q.Left)
}
func isSymmetric(root *TreeNode) bool {return isSameTree(root.Left,root.Right)
}
  • tips
    • 转换为比较左边的右子树是否等于右边的左子树,左边的左子树是否等于右边的右子树即可
      在这里插入图片描述
平衡二叉树
  • 题目描述
    在这里插入图片描述
  • 解题思路
    • 对左右子树的深度做递归
  • 代码参考
/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
func abs(x int) int{if x>0{return x}else{return -x}
}func get_height(root *TreeNode) int{if root == nil{return 0}left_height := get_height(root.Left)if left_height == -1{return -1 //提前退出,不再递归}right_height := get_height(root.Right)if right_height == -1 || abs(right_height - left_height)>1{return -1}return max(right_height,left_height)+1}func isBalanced(root *TreeNode) bool {if get_height(root) != -1{return true}else{return false}
}
  • tips
    • 需要单独写一个获取树的最大深度的get_height函数
    • go中没有abs函数,需要自己写
    • -1表示不平衡,可以实现提前退出,就不用递归了
二叉树的右视图
  • 题目描述
    在这里插入图片描述

  • 解题思路

    • 因为要找右视图,所以先递归右子树,再递归左子树
    • 怎么判断节点是否需要记录到答案中
      • 在递归的同时记录节点个数(也就是递归深度),如果递归深度等于答案长度,那么这个节点就需要记录到答案中
      • 递归左子树的时候,深度小于答案长度的就都不计进去
  • 代码参考

func rightSideView(root *TreeNode) (ans []int) {//声明 dfs 为一个函数变量: var dfs func(*TreeNode, int) 声明了一个名为 dfs 的变量,这个变量的类型是一个函数类型。var dfs func(*TreeNode, int)// 这样,dfs 就可以像普通函数一样被调用,并且在函数体内部它可以递归调用自身。在这里我们可以直接在一个函数内部定义 DFS 逻辑,而不需要创建一个单独的命名函数。dfs = func(node *TreeNode, depth int) {if node == nil {return}if depth == len(ans) { // 这个深度首次遇到ans = append(ans, node.Val)}dfs(node.Right, depth+1) // 先递归右子树,保证首次遇到的一定是最右边的节点dfs(node.Left, depth+1)}dfs(root, 0)return
}
  • tips
    • 声明 dfs 为一个函数变量: var dfs func(*TreeNode, int) 声明了一个名为 dfs 的变量,这个变量的类型是一个函数类型。
    • 这样,dfs 就可以像普通函数一样被调用,并且在函数体内部它可以递归调用自身。在这里我们可以直接在一个函数内部定义 DFS 逻辑,而不需要创建一个单独的命名函数。

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

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

相关文章

【网安案例学习】暴力破解攻击(Brute Force Attack)

### 案例与影响 暴力破解攻击在历史上曾导致多次重大安全事件,特别是在用户数据泄露和账户被盗的案例中。随着计算能力的提升和密码管理技术的进步,暴力破解的威胁虽然有所减弱,但仍需警惕,特别是在面对高价值目标时。 【故事一…

创建一个基于SSM框架的药品商超管理系统

创建一个基于SSM(Spring Spring MVC MyBatis)框架的药品商超管理系统是一个涉及多个步骤的过程。以下是一个详细的开发指南,包括项目结构、数据库设计、配置文件、Mapper接口、Service层、Controller层和前端页面的示例。 1. 需求分析 明…

二十七、Python基础语法(面向对象-上)

面向对象(oop):是一种程序设计的方法,面向对象关注的是结果。 一、类和对象 类和对象:是面向对象编程中非常重要的两个概念。 类:具有相同特征或者行为的一类事物(指多个)的统称&…

【一分钟配置Python环境变量

配置Python环境变量可以帮助系统找到Python解释器和相关工具。下面是如何在不同操作系统上配置Python环境变量的步骤: Windows 1.安装Python: 在官方网站下载并安装Python,安装过程中选择“Add Python to PATH”选项。 手动配置环境变量&a…

(蓝桥杯C/C++)——STL(上)

目录 一、vector 1.vector的定义和特性 2.vector的常用函数 3.vector排序去重 二、map 1.map 2.multimap 3.unordered_map 三、stack 1.stack的定义和结构 四、pair 1.pair的定义和结构 2.pair的嵌套 3.pair自带的排序规则 一、vector 1.vector的定义和特性 C中&…

UML图之对象图详解

~犬📰余~ “我欲贱而贵,愚而智,贫而富,可乎? 曰:其唯学乎” 零、什么是对象图 对象图(Object Diagram)是UML中一种重要的静态结构图,它用于表示在特定时间点上系统中的对…

同三维T80004EHH-4K30W 4K超清HDMI编解码器

1路HDMI输入1路3.5音频输入,1路HDMI输出1路3.5音频输出,1个USB1个TF卡槽,带RS485 支持4K30,支持2路解码2路转码,可选配WEBRTC/NDI协议,可选配硬件WEBRTC解码,编码、解码、转码、导播、录制多功…

设计一个灵活的RPC架构

RPC架构 RPC本质上就是一个远程调用,需要通过网络来传输数据。传输协议可以有多种选择,但考虑到可靠性,一般默认采用TCP协议。为了屏蔽网络传输的复杂性,需要封装一个单独的数据传输模块用来收发二进制数据,这个单独模…

网络安全入门学习路线 怎样科学的进行网络安全学习

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面…

“中信同业+”焕新升级 锚定数字金融新主线,做实金融“五篇大文章”

9月20日,“中信同业”升级发布会及生物多样性债券指数发布在京顺利举办,此次活动以“做强数字金融 服务实体经济”为主题,由中信金控指导,中信银行主办,中信各金融子公司联合承办。来自银行、证券、保险、基金等行业百…

‌Linux tac命令‌

‌Linux tac命令‌是一个用于逆序显示文件内容的工具,其名称来源于“cat”的反向拼写。tac命令的基本功能是将文件的内容从最后一行开始输出,直到第一行结束,这与cat命令的功能相反,cat命令是从第一行开始输出直到最后一行。 tac…

vite乾坤 vite-plugin-qiankun 报错 ReferenceError: ReadableStream is not defined

今天新接入一个子应用,发现其他子项目都可以运行,改造代码都差不多。我新的项目却报错 ReferenceError: ReadableStream is not defined断点发现是有个库版本不对,上github搜到了问题。 https://github.com/tengmaoqing/vite-plugin-qiankun…

ELK之路第四步——整合!打通任督二脉

ELK之路第四步——整合!打通任督二脉 前言1.架构2.下载资源3.整合开始1.分别启动三个es2.启动kibana3.新建filebeat_logstash.yml配置文件4.修改logstash的启动配置文件5.启动logstash6.启动filebeat7.Kibana查看 4.结语 前言 在开始本篇之前,你需要用到…

[JAVAEE] 多线程的案例(四) - 定时器

目录 一. 什么是定时器? 二. java中的定时器类 三. 定时器的简单使用. 四. 模拟实现定时器 4.1 实现 MyTimerTask 4.2 实现 MyTimer 一. 什么是定时器? 定时器相当于闹钟, 时间到了就执行一些逻辑. 二. java中的定时器类 使用Timer类实例化一个定时器对象. Timer类中的…

C++调试经验:Ubuntu下Qt工程链接常见库的方式(持续更新)

目录 1. Qt工程链接OpenCV库 2. Qt工程链接tinyxml库 3. Qt工程链接pugixml库 4. Qt工程链接geographiclib地理信息转换库 5. Qt工程链接gstreamer音视频流媒体处理库 6. Qt工程链接VTK三维可视化库 7. Qt工程链接PCL点云处理库 8. Qt工程链接json-cpp库 9. Qt工程链…

Vue学习笔记(十一)

一. Promise 1. 异步 异步:则是将耗时很长的A交付的工作交给系统之后,就去继续做B交付的工作,等到系统完成了前面的工作之后,再通过回调或者事件,继续做A剩下的工作。AB工作的完成顺序,和交付他们的时间顺…

江协科技STM32学习- P21 ADC模数转换器

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

OpenAI放弃自制AI芯片!伦敦场开发者日Hugging Face工程师现场“拷问”Sam Altman

OpenAI 2024年开发者大会第二场(伦敦场)刚结束。 10月初在旧金山举办了第一场 OpenAI 开发者大会,但这次没有像上一场放出很多花活,这次开始走剧透局了! 现场的OpenAI 产品主管 曝光了 GPT o1即将更新的功能&#xf…

浅谈网络安全

​ 大家好,我是程序员小羊! 前言: 网络安全是确保信息系统、网络及数据免受未授权访问、使用、披露、篡改或破坏的重要领域。随着数字化进程的加速和互联网的普及,网络安全的重要性显著提升。今天,网络威胁呈现出多样化…

在面试了些外包以后,我有了些自己的思考

大家好,我是洋子,最近公司在降本增效,需要把外包从北京迁移到陕西的某新一线城市,其实就是变相裁员,减少外包的成本,裁掉现有的员工,重新招聘新人 在整个测试行业,外包测试的比重是…