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

前言

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

内容

一、二叉树的右视图

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。脑子不太清醒,语言能力有点下降。。。好好休息!

  • 21
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值