代码随想录day14 || 226 翻转二叉树,101 对称二叉树, 104 二叉树的最大深度, 111 二叉树的最小深度

news/2024/11/16 18:26:49/文章来源:https://www.cnblogs.com/zhougongjin55/p/18332121

226 翻转二叉树

func invertTree(root *TreeNode) *TreeNode {// 思考,广度优先遍历,对于每一层,翻转其左右子节点if root == nil {return nil}queue := list.New()queue.PushBack(root)size := 1 // 存储每一层的节点个数for queue.Len() > 0{var count intfor i:=0; i<size; i++{  // 弹出该层所有的节点node := queue.Remove(queue.Front()).(*TreeNode)// 将该节点的左右子节点翻转if node.Left != nil || node.Right != nil {node.Left, node.Right = node.Right, node.Left}// 将翻转后的子节点入队列if node.Left != nil {queue.PushBack(node.Left)count++}if node.Right != nil {queue.PushBack(node.Right)count++}}size = count}return root
}
// list双向链表实现的队列,插入移除操作复杂度都是1
// 所以时间 遍历翻转每一个节点 n  空间 队列 n
func invertTree(root *TreeNode) *TreeNode {  // 递归参数返回值// 递归前序遍历if root == nil {  // 递归终止条件return nil}// 交换左右子节点if root.Left != nil || root.Right != nil {  // 单次递归逻辑root.Left, root.Right = root.Right, root.Left}invertTree(root.Left)invertTree(root.Right)return root
}
// 时间复杂度n  空间 如果平衡二叉树logn  如果链表 n
// 递归前序后序遍历都可以直观理解,但是中序时候,需要特殊处理递归逻辑,因为先一步递归左子树之后,处理完交换逻辑左子树变成了右子树,此时往下执行交换右子树就是错误的,所以之后的逻辑应该改成仍然交互左子树

101 判断二叉树对称

func isSymmetric(root *TreeNode) bool {// 递归if root == nil {return true}return symmetric(root.Left, root.Right)
}func symmetric(left, right *TreeNode) bool { // 递归参数返回值// 递归终止条件if left == nil && right != nil ||left != nil && right == nil ||left != nil && right != nil && left.Val != right.Val {// 左空右非空 || 左非空右边空 || 左右数值不相等return false}if left == nil && right == nil {return true}// 最后一种情况,左右非空并且值相等// 递归逻辑inner := symmetric(left.Left, right.Right)outer := symmetric(left.Right, right.Left)return inner && outer
}时间,每个节点遍历一次 n 空间logn

104 最大深度

image

func maxDepth(root *TreeNode) int {// 考虑层序遍历if root == nil {return 0}queue := list.New()queue.PushBack(root)dep := 1size := 1for queue.Len() >0{var count intfor i:=0; i<size; i++ {node := queue.Remove(queue.Front()).(*TreeNode)if node.Left != nil {queue.PushBack(node.Left)count++}if node.Right != nil {queue.PushBack(node.Right)count++}}if count == 0{return dep}size = countdep++}return dep
}
// 层序遍历每个节点遍历一次,时间n 空间 队列长度最长为n/2 = n
func maxDepth(root *TreeNode) int {// 递归方法,深度优先遍历,因为需要不断传递子节点高度给父节点,所以考虑后续遍历,同时根节点高度就是树的深度if root == nil {return 0}left := maxDepth(root.Left)right := maxDepth(root.Right)var res int = rightif left > right {res = left}return res+1
}

111 最小深度

func minDepth(root *TreeNode) int {// 思考层序遍历,终止条件是左右子树都是空if root == nil {return 0}queue := list.New()queue.PushBack(root)dep := 1size := 1for queue.Len() >0 {var count intfor i := 0; i < size; i++ {node := queue.Remove(queue.Front()).(*TreeNode)if node.Left == nil && node.Right == nil {return dep}if node.Left != nil {queue.PushBack(node.Left)count++}if node.Right != nil {queue.PushBack(node.Right)count++}}size = countdep++}return dep
}
// 层序遍历每个节点遍历一次,时间n 空间 队列长度最长为n/2 = n
func minDepth(root *TreeNode) int {// 递归方法,深度优先遍历,最小深度,终止条件是遇到无叶子的子节点,从上往下传递,中左右前序遍历if root == nil {return 0}// 如果左子树为空,递归右子树if root.Left == nil {return minDepth(root.Right) + 1}// 如果右子树为空,递归左子树if root.Right == nil {return minDepth(root.Left) + 1}// 左右子树都不为空,返回左右子树的最小深度leftDepth := minDepth(root.Left)rightDepth := minDepth(root.Right)return int(math.Min(float64(leftDepth), float64(rightDepth))) + 1
}

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

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

相关文章

【数值计算方法】数值积分微分

《现代数值计算方法 第二版》1. 引言 高数中计算积分思路基本是牛顿莱布尼兹法: \[I[f]=\int_{a}^{b}f(x)\mathrm{d}x=F(b)-F(a), \]\[F^{\prime}(x)=f(x). \]实际计算中,原函数一般无法求出.给不出解析解,只能求出数值解. 设在区间 [a,b]( 不妨先设 a,b 为有限数 ) 上 ,\(f(x)…

经典的反转

def reverseArr(arr, start, end):while(start < end):arr[start], arr[end] = arr[end], arr[start]start +=1;end -=1def fun(arr,d, n):reverseArr(arr,0, n-1)reverseArr(arr, n-d, n-1)reverseArr(arr,0, n-d-1)arr = [1,2,3,4,5,6,7] fun(arr,2,len(arr)) print(arr)

【日记】今天又是哪朵小云不开心了呀(1886 字)

正文上午上班没多久,天就特别阴,感觉像是要下暴雨的样子。前台接了一个电话,家里人打来的,她妈妈叮嘱她,要注意一点。他们那边已经开始下了。她转过头对我笑笑说,原来下雨在一个城里也能不同步。当时我笑了笑,对她说,局部降雨还有更局部的,然后打开的视频网站,随便点…

51nod两问-Pinball等

问题1-Pinball为什么这样解释的通,我看不懂什么意思?还有这个 \(e\) 在后面状态中没有体现。具体做法?为什么只有 \([a_i,c_i]\) 需要考虑?他可以往左边掉。那么从 \(n\) 开始掉又如何考虑 Kamp手绘的图:这个图似乎就不满足了。不知道什么意思。这个思路怎么做。

2024.7.26模拟赛8

模拟赛 抽象比赛,含金量最高的是题目背景? 好像还是连续的。。。 T1 Same Integers 题目背景签到题,因为只有加操作,目标是将两个较小的数加成最大的。 根据差的奇偶判断能否加二得到,如果不能先加一调一下。(简单题,题解抽象一点也没事吧)code #include<bits/stdc+…

大道至简读后有感

《大道至简》读后有感 作为一名初学计算机语言的学生,在语言的学习过程中,总会有各种问题困扰我。在阅读《大道至简》这本经典软件工程读物之前,我过去常常是追求复杂性和繁琐的代码设计。因为我觉得这样能体现我的个人水平,更“高级”之类的,我会为了实现某个功能而不断添…

mongodb数据库范围分片数据分布不均匀

【说明】 当前使用mongodb分片,三个分片mongos> sh.status() --- Sharding Status --- sharding version: {"_id" : 1,"minCompatibleVersion" : 5,"currentVersion" : 6,"clusterId" : ObjectId("66a30ccca62de41d6b0241a4&…

Markdown排版规范

Markdown 语法虽然多,但随便乱用的话反而会显得不美观,本文就推荐一些常见的排版规则。Markdown 语法虽然多,但随便乱用的话反而会显得不美观,本文就推荐一些常见的排版规则。 ‍ ‍ Markdown 标记的使用规范 ‍ 标题一级标题,通常是用来写文章的标题。而大部分情况下,文…

便宜的和贵的 SSL 证书有什么区别?

在网络世界中,SSL 证书如同守护网站安全的忠诚卫士,确保数据在传输过程中的保密性和完整性。然而,当我们在选择 SSL 证书时会发现,其价格参差不齐,从免费到昂贵,跨度较大。那么,便宜的 SSL 证书和贵的 SSL 证书到底有哪些显著的区别呢? 验证级别和审核流程 首先,验证方…

在 Visual Studio 2022 中,开发 ASP.NET 网站并在 Windows Server 2003 中进行部署

一、ASP.NET 网站程序开发 新建项目类型:ASP.NET Web 应用程序(.NET Framework) 引用包:Microsoft.AspNet.WebApi、Microsoft.AspNet.Mvc,版本:4.0.X 创建文件:Global.asax 启动代码: public class WebApiApplication : HttpApplication {protected void Application_S…

stable diffusion 入门教程

sd基础 工作原理&入门输入提示词后 有文本编码器将提示词编译成特征向量,vae编码器将特征向量传入潜空间内,特征向量在潜空间内不断降噪,最后通过vae解码器将降噪之后的特征向量 解码成一个个像素组成的图片 一般选中默认vae模型解码编码的模型CLIP值越大,提前停止的越…