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

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

前言

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

内容

一、二叉树的右视图

199.二叉树的右视图

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

广度优先搜索

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

func rightSideView(root *TreeNode) []int {
    var res []int
    if root==nil{
        return res
    }
 
 queue:=list.New()
 queue.PushBack(root)

 for queue.Len()>0{
     length:=queue.Len()
     for i:=0;i<length;i++{
         node:=queue.Remove(queue.Front()).(*TreeNode)
         if node.Left!=nil{
             queue.PushBack(node.Left)
         }
         if node.Right!=nil{
             queue.PushBack(node.Right)
         }
         if i==length-1{
            res=append(res,node.Val)
         }
     }
     
 }
 return res
}
深度优先搜索
func rightSideView(root *TreeNode)(ans []int){
    var dfs func(*TreeNode,int)
    dfs=func(node *TreeNode,depth int){
        if node==nil{
            return 
        }
        if depth==len(ans){
            ans=append(ans,node.Val)
        }
        dfs(node.Right,depth+1)
        dfs(node.Left,depth+1)
    }
    dfs(root,0)
    return
}
 二、二叉树的层平均数

637.二叉树的层平均数

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

广度优先搜索
func averageOfLevels(root *TreeNode) []float64 {
    var res []float64
    curLevel:=[]*TreeNode{root}
    for len(curLevel)>0{
        sum:=0
        nextLevel:=[]*TreeNode{}
        for _,node:=range curLevel{
            sum+=node.Val

            if node.Left!=nil{
                nextLevel=append(nextLevel,node.Left)
            }
            if node.Right!=nil{
                nextLevel=append(nextLevel,node.Right)
            }
        
        }
    res=append(res,float64(sum)/float64(len(curLevel)))
       curLevel=nextLevel
    }
    return  res
}
三、N叉树的层序遍历 

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

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

广度优先搜素

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

/**
 * Definition for a Node.
 * type Node struct {
 *     Val int
 *     Children []*Node
 * }
 */

func levelOrder(root *Node) [][]int {
    var res [][]int
    if root==nil{
        return res
    }
    
    curLevel:=[]*Node{root}
    for len(curLevel)>0{
        
        level:=[]int{}
      temp:=curLevel
      curLevel=nil
      for _,node:=range temp{
          level=append(level,node.Val)
          curLevel=append(curLevel,node.Children...)
      }//node.Children... 是一个可变参数,可以接收任意数量的子节点,并将它们存储在一个列表中。
    
        res=append(res,level)
      
    }
    return res
}

最后

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


http://www.kler.cn/news/137291.html

相关文章:

  • 安卓老项目改造为AndroidX
  • php字符串处理函数的使用
  • CMake 判断操作系统类型
  • git基本操作(配图超详细讲解)
  • 交叉编译tcpdump
  • 游戏中的资源动态加载
  • 重磅解读 | 阿里云 云网络领域关键技术创新
  • 入行IC | 从小白助理级,到总监专家级,到底要经历怎样的成长阶段呢?
  • go map字典操作
  • 卷积神经网络(VGG-19)灵笼人物识别
  • Python每日一练-DAY01
  • docker通过挂载conf文件启动redis
  • LeetCode39- 组合总和
  • 掌握深度学习利器——TensorFlow 2.x实战应用与进阶
  • scp rsync 软连接
  • linux控制台命令
  • OpenCV 中Mat.depth()的理解——每个像素的位数——每个像素中每个通道的精度
  • Qt中的tr函数
  • Java 基础面试题大概有哪些?
  • spring为什么要使用三级缓存来解决循环依赖