• 力扣刷题第二十七天--二叉树


    前言

    题目大同小异,按要求来即可。

    内容

    一、二叉树的右视图

    199.二叉树的右视图

    给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

    广度优先搜索

    取每层最后一个元素,放入结果集

    1. func rightSideView(root *TreeNode) []int {
    2. var res []int
    3. if root==nil{
    4. return res
    5. }
    6. queue:=list.New()
    7. queue.PushBack(root)
    8. for queue.Len()>0{
    9. length:=queue.Len()
    10. for i:=0;i
    11. node:=queue.Remove(queue.Front()).(*TreeNode)
    12. if node.Left!=nil{
    13. queue.PushBack(node.Left)
    14. }
    15. if node.Right!=nil{
    16. queue.PushBack(node.Right)
    17. }
    18. if i==length-1{
    19. res=append(res,node.Val)
    20. }
    21. }
    22. }
    23. return res
    24. }
    深度优先搜索
    1. func rightSideView(root *TreeNode)(ans []int){
    2. var dfs func(*TreeNode,int)
    3. dfs=func(node *TreeNode,depth int){
    4. if node==nil{
    5. return
    6. }
    7. if depth==len(ans){
    8. ans=append(ans,node.Val)
    9. }
    10. dfs(node.Right,depth+1)
    11. dfs(node.Left,depth+1)
    12. }
    13. dfs(root,0)
    14. return
    15. }
     二、二叉树的层平均数

    637.二叉树的层平均数

    给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。

    广度优先搜索
    1. func averageOfLevels(root *TreeNode) []float64 {
    2. var res []float64
    3. curLevel:=[]*TreeNode{root}
    4. for len(curLevel)>0{
    5. sum:=0
    6. nextLevel:=[]*TreeNode{}
    7. for _,node:=range curLevel{
    8. sum+=node.Val
    9. if node.Left!=nil{
    10. nextLevel=append(nextLevel,node.Left)
    11. }
    12. if node.Right!=nil{
    13. nextLevel=append(nextLevel,node.Right)
    14. }
    15. }
    16. res=append(res,float64(sum)/float64(len(curLevel)))
    17. curLevel=nextLevel
    18. }
    19. return res
    20. }
    三、N叉树的层序遍历 

    给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。

    树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。

    广度优先搜素

    一个结点有多个孩子,别忘了root为空

    1. /**
    2. * Definition for a Node.
    3. * type Node struct {
    4. * Val int
    5. * Children []*Node
    6. * }
    7. */
    8. func levelOrder(root *Node) [][]int {
    9. var res [][]int
    10. if root==nil{
    11. return res
    12. }
    13. curLevel:=[]*Node{root}
    14. for len(curLevel)>0{
    15. level:=[]int{}
    16. temp:=curLevel
    17. curLevel=nil
    18. for _,node:=range temp{
    19. level=append(level,node.Val)
    20. curLevel=append(curLevel,node.Children...)
    21. }//node.Children... 是一个可变参数,可以接收任意数量的子节点,并将它们存储在一个列表中。
    22. res=append(res,level)
    23. }
    24. return res
    25. }

    最后

    平静,保持calm。脑子不太清醒,语言能力有点下降。。。好好休息!

  • 相关阅读:
    Oracle/PLSQL: VSize Function
    微服务架构介绍
    自学C++ day01
    【lwip】07-链路层收发以太网数据帧源码分析
    使用注解实现限流
    【scikit-learn基础】--『监督学习』之 均值聚类
    Java-随机数据生成器(造数据)
    【EasyExcel】第二篇:导出excel文件,导出多个sheet工作空间
    这个项目,荣获“绽放杯”一等奖!
    Java.lang.Character类中codePointAt(CharSequence seq, int index)方法具有什么功能呢?
  • 原文地址:https://blog.csdn.net/m0_62786673/article/details/134530016