Leetcode With Golang 二叉树 part1

这一部分主要来梳理二叉树题目最简单最基础的部分,包括遍历,一些简单题目。

一、Leecode 144 - 二叉树的前序遍历

https://leetcode.cn/problems/binary-tree-preorder-traversal/description/

二叉树的遍历是入门。我们需要在程序一开始就创建一个空的数组,然后递归遍历左右节点,将节点放进这个数组内。下面直接给出代码:

func preorderTraversal(root *TreeNode) []int {if root == nil{return nil}res := make([]int,0)res = append(res,root.Val)res = append(res,preorderTraversal(root.Left)...)res = append(res,preorderTraversal(root.Right)...)return res}

append方法后面的“...”说明:

        使用append函数和...操作符将这个切片中的所有元素添加到res中。...操作符的作用是将一个切片的所有元素作为独立的参数传递给函数,而不是将整个切片作为一个单独的参数。这意味着如果preorderTraversal(root.Left)返回一个切片[a, b, c]append(res, preorderTraversal(root.Left)...)实际上是append(res, a, b, c)

二、Leecode 94 - 二叉树的中序遍历

https://leetcode.cn/problems/binary-tree-inorder-traversal/

和前序遍历不同,但也很类似,只是将append的操作放到了递归遍历左右子树的操作中间。

func inorderTraversal(root *TreeNode) []int {if root == nil{return nil}res := make([]int,0)res = append(res,inorderTraversal(root.Left)...)res = append(res,root.Val)res = append(res,inorderTraversal(root.Right)...)return res}

三、Leecode 145 - 二叉树的后序遍历

https://leetcode.cn/problems/binary-tree-postorder-traversal/description/

func postorderTraversal(root *TreeNode) []int {res := make([]int,0)if root == nil{return nil}res = append(res,postorderTraversal(root.Left)...)res = append(res,postorderTraversal(root.Right)...)res = append(res,root.Val)return res}

四、Leecode 100 - 相同的树

https://leetcode.cn/problems/same-tree/description/

一共有两棵二叉树,我们怎么判断他们是一样的?要是两棵树都是空的,那就是一样的,要是有一棵树是空的,另一棵树却不是,那就不是一样的,如果两棵树都不为空,但是对应节点的值不一样,那也不是一样的。然后我们递归遍历两棵树的左右子树就可以了。

func isSameTree(p *TreeNode, q *TreeNode) bool {if q ==nil && p == nil{return true}if q ==nil || p == nil{return false}if p.Val != q.Val{return false}return isSameTree(p.Left,q.Left) && isSameTree(p.Right,q.Right)}

五、Leecode 101 - 对称二叉树

https://leetcode.cn/problems/symmetric-tree/description/

和上面一题的思路一样。不过我们要再写一个辅助函数。来将一个二叉树的左右节点传进去,检测左子树的左侧与右子树的右侧,以及左子树的右侧与右子树的左侧是否相等。

func isSymmetric(root *TreeNode) bool {// 如果树为空,那么它是对称的。if root == nil {return true}// 开始从根节点的左右子树进行比较return isMirror(root.Left, root.Right)
}// 辅助函数,用于递归比较两个节点是否是镜像对称的
func isMirror(left, right *TreeNode) bool {// 如果两个节点都为空,那么它们是对称的if left == nil && right == nil {return true}// 如果其中一个节点为空,另一个不为空,那么它们不对称if left == nil || right == nil {return false}// 检查当前两个节点的值是否相等,且左节点的左子树和右节点的右子树是否对称,// 左节点的右子树和右节点的左子树是否对称return left.Val == right.Val && isMirror(left.Left, right.Right) && isMirror(left.Right, right.Left)
}

六、Leecode 404 - 左叶子之和

https://leetcode.cn/problems/sum-of-left-leaves/

我们需要判断哪些节点是左叶子。然后直接递归。

func sumOfLeftLeaves(root *TreeNode) int {if root == nil {return 0}sum := 0// 检查左节点是否为叶节点if root.Left != nil && root.Left.Left == nil && root.Left.Right == nil {sum += root.Left.Val}// 递归地累加左右子树的左叶节点的和sum += sumOfLeftLeaves(root.Left)sum += sumOfLeftLeaves(root.Right)return sum
}

七、Leecode LCP 44 - 开幕式焰火

https://leetcode.cn/problems/sZ59z6/description/

这里我们创建一个"set",将节点的值放进这个set中,遍历完之后,直接返回set的长度。在Golang中没有set这个结构,所以我们用字典来模拟,一样。

func numColor(root *TreeNode) int {set := make(map[int]bool)treeset(root,set)return len(set)}
func treeset(root *TreeNode,set map[int]bool){if root == nil{return}set[root.Val] = truetreeset(root.Left,set)treeset(root.Right,set)}

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

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

相关文章

LabVIEW荧光显微镜下微管运动仿真系统开发

LabVIEW荧光显微镜下微管运动仿真系统开发 在生物医学研究中,对微管运动的观察和分析至关重要。介绍了一个基于LabVIEW的仿真系统,模拟荧光显微镜下微管的运动过程。该系统提供了一个高效、可靠的工具,用于研究微管与运动蛋白(如…

【教学类-19-07】20240214《ABAB式-规律黏贴18格-手工纸15*15CM-一页一种图案,A空,竖向、有边框》(中班)

背景需求 利用15*15CM手工纸制作AB色块手环(手工纸自带色彩) 素材准备 代码展示 作者:阿夏 时间:2024年2月14日 名称:正方形数字卡片AB图案 _ 华光彩云_CNKI A的位置有图案 A空18格 AB向 一页一种图案,…

OAuth 2.0 协议介绍【实现 GitHub 第三方登录】

OAuth(是 Open Authorization 开放授权的缩写),在全世界得到广泛应用,目前的版本是2.0版。 本文会对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为RFC 6749。 OAuth 2.0 是一个开放标准&#…

vmware workstation群晖虚拟机vmdk文件导出

为了防止群晖虚拟机中整个挂掉,里面的文件导不出来,尝试直接从vmdk中获取内容。 1、想采用diskgenius去读取文件,发现volume1是空的。只能读取群晖的系统文件。 2、选择另一个linux系统的虚拟机,选择对应的vmdk 3、如果有文件管理…

【JAVA-Day81】 线程休眠: Java 中暂停线程执行的方法 ⏸️

线程休眠: Java 中暂停线程执行的方法 ⏸️💤 线程休眠: Java 中暂停线程执行的方法 ⏸️💤摘要 📝引言 🚀正文 📚一、什么是线程休眠 ⏸️二、线程什么情况下会休眠 ❓三、模拟线程休眠 &#…

236. 二叉树的最近公共祖先 - 力扣(LeetCode)

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以…

2024 前端面试题 附录1

这里记录的是今天看到的其他的知识点 原篇地址:2024 前端面试题(GPT回答 示例代码 解释)No.1 - No.20 目录 这里记录的是今天看到的其他的知识点原篇地址:[2024 前端面试题(GPT回答 示例代码 解释)No.…

基于Echarts的可视化项目

整体的效果 概览区域 <!-- 概览区域模块制作 --><div class"panel overview"><div class"inner"><ul><li><h4>2190</h4><span><i class"icon-dot"></i>设备总数</span></…

SpringCloud-搭建Nacos配置中心

一、Nacos 功能介绍 Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;是阿里巴巴开源的一个分布式服务注册、配置管理&#xff0c;以及服务健康管理平台。在微服务架构中&#xff0c;配置管理是至关重要的一环&#xff0c;Nacos 提供了可靠、动态的配置…

问题:如果要编辑建好的建筑和空间,需要在分级按钮( )和细分操作按钮楼层下,才能选中建筑物和空间; #微信#媒体#其他

问题&#xff1a;如果要编辑建好的建筑和空间&#xff0c;需要在分级按钮&#xff08; &#xff09;和细分操作按钮楼层下&#xff0c;才能选中建筑物和空间&#xff1b; A、楼层 B、规划图 C、全景 D、建筑物 参考答案如图所示

<网络安全>《33 网络信息安全基础(4)网络安全工程师进阶体系(一)》

1 图谱 1 基础入门 1.1 网络安全导论 网络安全行业简介&#xff1a; 行业前景 历史 重要事件 网络安全意识与法律法规 安全意识 法律法规 案例 网络安全管理概述 安全运营、运维、模型 等保测评 等保简介、等保规定、流程和规范 1.2 渗透测试基础 渗透测试概述 - 流程、分…

CGAL 提取网格指定面片

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里我们将通过指定面片的索引来提取某个网格的子网格对象。 二、实现代码 #include <iostream> #include <vector>#include <CGAL/Exact_predicates_inexact_c

jmeter-07jmeter与数据库关联

文章目录 一、JDBC驱动下载二、连接数据库三、写对应的SQL四、进行断言处理方法一:使用beanshell进行断言方法二:使用json进行断言四、为什么数据库查询的结果赋值给了**sql_name**,但是在断言的时候使用的是**sql_name_1**呢?一、JDBC驱动下载 JDBC驱动下载链接 1)5.x.x…

公需课考试怎么搜题找答案? #学习方法#学习方法

这些软件以其强大的搜索引擎和智能化的算法&#xff0c;为广大大学生提供了便捷、高效的解题方式。下面&#xff0c;让我们一起来了解几款备受大学生欢迎的搜题软件吧&#xff01; 1.粉鹿搜题 这是一个公众号 在线搜题刷题平台&#xff0c;支持语言、文字、拍照多种搜索方式…

VitePress-16- 配置- head 的配置网页icon与插入一个script标签

作用说明 head 配置项&#xff0c;可以在页面 HTML 的 <head> 标签中呈现的其他元素。 用户添加的标签在结束 head 标签之前呈现&#xff0c;在 VitePress 标签之后。说白了&#xff0c;就是自定义一些 head 标签中的元素&#xff0c;例如 &#xff1a;页面的icon等。 由…

holidaywork5

TCP和UDP区别 TCP ----稳定 1、提供面向连接的&#xff0c;可靠的数据传输服务&#xff1b; 2、传输过程中&#xff0c;数据无误、数据无丢失、数据无失序、数据无重复&#xff1b; 3、数据传输效率低&#xff0c;耗费资源多&#xff1b; 4、数据收发是不同步的&#xff1b; UD…

JVM-面试题

一、对象 1、对象创建 类加载检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池定位到类的符号引用,并且检查这个符号引用代表的类是否被加载、解析和初始化过。若没有,必须先执行类加载过程。分配内存 类加载检查通过后,jvm将为新生对象分配内存,…

ubuntu22.04@laptop OpenCV Get Started: 009_image_thresholding

ubuntu22.04laptop OpenCV Get Started: 009_image_thresholding 1. 源由2. image_thresholding应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 重点分析3.1 Binary Thresholding ( THRESH_BINARY )3.2 Inverse-Binary Thresholding ( THRESH_BINARY_INV )3.3 Truncate Threshold…

(15)Hive调优——数据倾斜的解决指南

目录 前言 一、什么是数据倾斜 二、发生数据倾斜的表现 2.1 MapReduce任务 2.2 Spark任务 三、如何定位发生数据倾斜的代码 四、发生数据倾斜的原因 3.1 key分布不均匀 3.1.1 某些key存在大量相同值 3.1.2 存在大量异常值或空值 3.2 业务数据本身的特性 3.3 SQL语句…

扶贫|精准扶贫管理系统|基于Springboot的精准扶贫管理系统设计与实现(源码+数据库+文档)

精准扶贫管理系统目录 目录 基于Springboot的精准扶贫管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员模块的实现 &#xff08;1&#xff09;用户信息管理 &#xff08;2&#xff09;贫困户信息管理 &#xff08;3&#xff09;新闻类型管理 &a…