当前位置: 首页 > news >正文

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

层序遍历

/*** 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.lryc.cn/news/224325.html

相关文章:

  • 前端 JS 经典:ES6 和 CommonJs 用法
  • MacOS升级后命令行出现xcrun: error: invalid active developer path报错信息
  • 【Qt】QPalette
  • 专门为Web应用程序提供安全保护的设备-WAF
  • Android Camera App启动流程解析
  • [工业自动化-8]:西门子S7-15xxx编程 - PLC主站 - CPU模块
  • QT事件循环和事件队列的理解
  • 【Android】画面卡顿优化列表流畅度一
  • SNP应邀参加2023中国企业数字化转型峰会暨赛意用户大会
  • 黑豹程序员-架构师学习路线图-百科:Knife4j API接口文档管理
  • PHP安全问题:远程溢出、DoS、safe_mode绕过漏洞
  • 2023云计算发展
  • javaSE学习笔记(六)泛型,异常
  • C/C++轻量级并发TCP服务器框架Zinx-游戏服务器开发006:基于redis查找玩家姓名+游戏业务实现总结
  • 数字政府!3DCAT实时云渲染助推上海湾区数字孪生平台
  • react之Component存在的2个问题
  • 【论文阅读】Generating Radiology Reports via Memory-driven Transformer (EMNLP 2020)
  • IP协议相关技术
  • Visual Studio2022安装教程【图文详解】(大一小白)编译软件
  • matlab 点云最小二乘拟合平面(PCA法)
  • socks5代理和https代理有什么不同?各自有哪些优点?
  • springboot,spring框架返回204 status code的时候,会吞掉返回值
  • 6-爬虫-scrapy解析数据(使用css选择器解析数据、xpath 解析数据)、 配置文件
  • idea 一直卡在maven正在解析maven依赖
  • 警告:未配置spring boot 配置注解处理器
  • 详解虚拟DOM的原理
  • 开设自己的网站系类03安装数据库(centos版)
  • Flutter StreamBuilder 实现局部刷新 Widget
  • 【代码随想录】算法训练营 第十六天 第六章 二叉树 Part 3
  • 【C++数据结构】顺序存储结构的抽象实现