刷题笔记day15-二叉树层序遍历

news/2024/12/22 19:14:51/

层序遍历

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/import ("container/list"
)func levelOrder(root *TreeNode) [][]int {// 思路1:此处肯定要使用队列result := [][]int{}if root == nil {return result}stack := list.New()stack.PushBack(root)for stack.Len() > 0 {stackLength := stack.Len()// 遍历每一层的所有节点newLis := []int{}for i := 0; i < stackLength; i++ {top := stack.Remove(stack.Front())node := top.(*TreeNode)newLis = append(newLis, node.Val)if node.Left != nil {stack.PushBack(node.Left)}if node.Right != nil {stack.PushBack(node.Right)}}result = append(result, newLis)}return result
}

107. 二叉树的层序遍历 II

这个题的意思是从底到上进行层次遍历。我就直接将上一题的从上到下的遍历结果,做一次翻转既可。

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/func levelOrderBottom(root *TreeNode) [][]int {// 思路:相当于是之前从顶往下的结果,反转一下// 这次使用自定义的队列吧,就不使用 container/list 了var (result [][]int)if root == nil {return result}var que []*TreeNodeque = append(que, root)for len(que) > 0 {length := len(que)partResult := []int{}for i := 0; i < length; i++ {front := que[0]que = que[1:]partResult = append(partResult, front.Val)if front.Left != nil {que = append(que, front.Left)}if front.Right != nil {que = append(que, front.Right)}}result = append(result, partResult)}// 反转结果var newResult [][]intfor i := len(result) - 1; i >= 0; i-- {newResult = append(newResult, result[i])}return newResult
}

199. 二叉树的右视图

目的:
思路:还是层次遍历,判断每一层 index 是否是最后一个。如果是,则将结果追加到result中。

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
import "container/list"func rightSideView(root *TreeNode) []int {// 我的思路是,层次遍历,每次访问一层的最右边的点。var result []intif root == nil {return result}que := list.New()que.PushBack(root)for que.Len() > 0 {length := que.Len()for i := 0; i < length; i++ {front := que.Remove(que.Front())node := front.(*TreeNode)// 每层最后一个放入result中。if i == length - 1 {result = append(result, node.Val)}if node.Left != nil {que.PushBack(node.Left)}if node.Right != nil {que.PushBack(node.Right)}}}return result
}

637. 二叉树的层平均值

还是层次遍历的思路,计算每一层的平均值。

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
import "container/list"func averageOfLevels(root *TreeNode) []float64 {// 思路:还是层次遍历,计算每一层的平均值。var result []float64if root == nil {return result}que := list.New()que.PushBack(root)for que.Len() > 0 {sum := 0length := que.Len()for i := 0; i < length; i++ {front := que.Remove(que.Front())node := front.(*TreeNode)sum += node.Valif node.Left != nil {que.PushBack(node.Left)}if node.Right != nil {que.PushBack(node.Right)}}result = append(result, float64(sum) / float64(length))}return result
}

429. N 叉树的层序遍历

换汤不换药

/*** Definition for a Node.* type Node struct {*     Val int*     Children []*Node* }*/import "container/list"func levelOrder(root *Node) [][]int {// 思路大差不差,依旧是层次遍历var result [][]intif root == nil {return result}que := list.New()que.PushBack(root)for que.Len() > 0 {length := que.Len()var partResult []intfor i := 0; i < length; i++ {front := que.Remove(que.Front())node := front.(*Node)partResult = append(partResult, node.Val)for _, item := range node.Children {que.PushBack(item)}}result = append(result, partResult)}return result
}

515.在每个树⾏中找最⼤值

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
func largestValues(root *TreeNode) []int {var result []intif root == nil {return result}que := list.New()que.PushBack(root)for que.Len() > 0 {length := que.Len()maxValue := que.Front().Value.(*TreeNode).Valfor i := 0; i < length; i++ {front := que.Remove(que.Front())node := front.(*TreeNode)// 每层最后一个放入result中。if node.Val > maxValue {maxValue = node.Val}if node.Left != nil {que.PushBack(node.Left)}if node.Right != nil {que.PushBack(node.Right)}}result = append(result, maxValue)}return result
}

226.翻转二叉树

不可以使用 中序遍历,因为左边的调整完后,返回到根节点后,左边的换到右边,这是又开始调整“左边的”了,相当与右边的没动。
可是使用前序遍历、后序遍历。

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
func invertTree(root *TreeNode) *TreeNode {// 思路:利用递归遍历,进行调整// 不可以使用 中序遍历,因为左边的调整完后,返回到根节点后,左边的换到右边,这是又开始调整“左边的”了,相当与右边的没动。// 三部曲:参数和返回值、单层逻辑、终止条件// 前序遍历:根左右if root == nil {return nil}root.Left, root.Right = root.Right, root.LeftinvertTree(root.Left)invertTree(root.Right)return root
}

http://www.ppmy.cn/news/1209177.html

相关文章

数据库数据恢复—MSSQL报错“附加数据库错误823”如何恢复数据?

数据库故障&分析&#xff1a; MSSQL Server数据库比较常见的报错是“附加数据库错误823”。如果数据库有备份&#xff0c;只需要还原备份即可&#xff1b;如果无备份或者备份不可用&#xff0c;则需要使用专业的数据恢复手段去恢复数据。 MSSQL Server数据库出现“823”的报…

3.0.3版vsftpd所支持的FTP命令

2023年11月9日&#xff0c;周四下午 ABOR&#xff1a;中止当前的数据连接。ACCT&#xff1a;提供用户帐户信息&#xff0c;通常用于特定的站点访问控制。ALLO&#xff1a;为服务器上的文件分配存储空间。APPE&#xff1a;将数据添加到现有的远程文件中。CDUP&#xff1a;将当前…

JS 处理文档选择和范围创建【createRange | getSelection】

介绍 1、const selection window.getSelection(); 说明&#xff1a; 1、用于获取用户当前文档选择的对象&#xff1b; 2、它返回一个 Selection 对象&#xff0c;该对象代表了用户选择的文本范围&#xff08;可以包含一个或多个范围&#xff0c;因为用户可以同时选择多个不相…

Flutter笔记:聊一聊依赖注入(上)

Flutter笔记 聊一聊依赖注入&#xff08;上&#xff09; 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details…

NIO 笔记(一)基础内容

【笔记来自&#xff1a;it白马】 NIO基础 **注意&#xff1a;**推荐完成JavaSE篇、JavaWeb篇的学习再开启这一部分的学习&#xff0c;如果在这之前完成了JVM篇&#xff0c;那么看起来就会比较轻松了。 在JavaSE的学习中&#xff0c;我们了解了如何使用IO进行数据传输&#xf…

绕过防盗链的几种方式

需要进行防盗链的绕过&#xff0c;我们必须先要了解Iframe、Referer和XMLHttpRequest对象的基本知识 目录 Iframe 基本用法 sandbox 属性 loading 属性 Referer Referrer-policy 设置referrer的两种方法 下面举三个将referrer设置为no-referrer的例子&#xff1a; 首先…

【从0到1设计一个网关】性能优化---缓存

文章目录 为什么要用缓存?Caffeine Cache使用Caffeine效果演示为什么要用缓存? 首先先了解一下为什么在网关中我们需要用到缓存。 我们可以从如下几点来入手这个问题: 处理大规模流量: 网关是系统的入口,需要处理大规模的请求流量。高性能的网关能够快速而有效地处理大量…

通义千问, 文心一言, ChatGLM, GPT-4, Llama2, DevOps 能力评测

引言 “克隆 dev 环境到 test 环境&#xff0c;等所有服务运行正常之后&#xff0c;把访问地址告诉我”&#xff0c;“检查所有项目&#xff0c;告诉我有哪些服务不正常&#xff0c;给出异常原因和修复建议”&#xff0c;在过去的工程师生涯中&#xff0c;也曾幻想过能够通过这…