golang刷leetcode 二叉树(5)右视图

2022-08-02 16:02:22 浏览数 (1)

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

示例:

代码语言:javascript复制
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:

   1            <---
 /   
2     3         <---
      
  5     4       <---

解题思路:

1,这个题目是层序遍历的变形:层序遍历不需要每一层断开,本题需要每一层断开,取每一层最右元素(左视图类似)

2,这里需要两个队列:

A,第一个队列存上一层结果

B,第二个队列存上一层的所有孩子

3,每次取上一层最右元素

代码语言:javascript复制
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func rightSideView(root *TreeNode) []int {
    var q queue
    var rr []int
    if root!=nil{
        q.push(root)
    }
    for!q.empty(){
        l:=q.last()
        rr=append(rr,l.Val)
        var q1 queue
        for!q.empty(){
            r:=q.pop()
            if r.Left!=nil{
                q1.push(r.Left)
            }
            if r.Right!=nil{
                q1.push(r.Right)
            }
        }
        q=q1
    }
    return rr
}

type queue struct{
    data []*TreeNode
}

func (q*queue)last()*TreeNode{
    l:=len(q.data)
    var r *TreeNode
    if l>0{
        r=q.data[l-1]
    }
    return r
}
func (q*queue)push(r *TreeNode){
    q.data=append(q.data,r)
}

func (q*queue)pop()*TreeNode{
    l:=len(q.data)
    var r *TreeNode
    if l>0{
        r=q.data[0]
        q.data=q.data[1:]
    }
    return r
}

func (q*queue)empty()bool{
    return len(q.data)<=0
}

给定一个二叉树,在树的最后一行找到最左边的值。

示例 1:

代码语言:javascript复制
输入:

    2
   / 
  1   3

输出:
1

示例 2:

代码语言:javascript复制
输入:

        1
       / 
      2   3
     /   / 
    4   5   6
       /
      7

输出:
7

注意: 您可以假设树(即给定的根节点)不为 NULL。

解题思路:

1,思路同上,还是借助两个队列

2,用变量记录每一层第一个值

代码语言:javascript复制
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func rightSideView(root *TreeNode) []int {
    var q queue
    var rr []int
    if root!=nil{
        q.push(root)
    }
    for!q.empty(){
        l:=q.last()
        rr=append(rr,l.Val)
        var q1 queue
        for!q.empty(){
            r:=q.pop()
            if r.Left!=nil{
                q1.push(r.Left)
            }
            if r.Right!=nil{
                q1.push(r.Right)
            }
        }
        q=q1
    }
    return rr
}

type queue struct{
    data []*TreeNode
}

func (q*queue)last()*TreeNode{
    l:=len(q.data)
    var r *TreeNode
    if l>0{
        r=q.data[l-1]
    }
    return r
}
func (q*queue)push(r *TreeNode){
    q.data=append(q.data,r)
}

func (q*queue)pop()*TreeNode{
    l:=len(q.data)
    var r *TreeNode
    if l>0{
        r=q.data[0]
        q.data=q.data[1:]
    }
    return r
}

func (q*queue)empty()bool{
    return len(q.data)<=0
}

您需要在二叉树的每一行中找到最大的值。

示例:

代码语言:javascript复制
输入: 

          1
         / 
        3   2
       /      
      5   3   9 

输出: [1, 3, 9]

解题思路:

1,跟上面的思路类似,只不过,求每一层的最大值

代码语言:javascript复制
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func largestValues(root *TreeNode) []int {
   var rr []int
    if root==nil{
        return rr
    } 
    var q,q1 queue
    q.push(root)
    for !q.empty(){
        q1=queue{}
        f:=q.first()
        max:=f.Val
        for !q.empty(){
            cur:=q.pop()
            if cur.Val>max{
                max=cur.Val
            }
            if cur.Left!=nil{
                q1.push(cur.Left)
            }
            if cur.Right!=nil{
                q1.push(cur.Right)
            }
        }
        rr=append(rr,max)
        q=q1
    }
    return rr
}

type queue struct{
    data []*TreeNode
}

func (q*queue)first()*TreeNode{
    l:=len(q.data)
    var r *TreeNode
    if l>0{
        r=q.data[0]
    }
    return r
}

func (q*queue)push(r *TreeNode){
    q.data=append(q.data,r)
}

func (q*queue)pop()*TreeNode{
    l:=len(q.data)
    var r *TreeNode
    if l>0{
        r=q.data[0]
        q.data=q.data[1:]
    }
    return r
}

func (q*queue)empty()bool{
    return len(q.data)<=0
}

给定一个非空二叉树, 返回一个由每层节点平均值组成的数组.

示例 1:

代码语言:javascript复制
输入:
    3
   / 
  9  20
    /  
   15   7
输出: [3, 14.5, 11]
解释:
第0层的平均值是 3,  第1层是 14.5, 第2层是 11. 因此返回 [3, 14.5, 11].

注意:

  1. 节点值的范围在32位有符号整数范围内

解题思路:

1,同上,对每一层求平均值

代码语言:javascript复制
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func averageOfLevels(root *TreeNode) []float64 {
    var q queue
   var avg []float64 
    if root!=nil{
    q.push(root)    
    }
    for !q.empty(){
        q1:=queue{}
        count:=0
        sum:=0.0
        for !q.empty(){
            cur:=q.pop()
            sum =float64(cur.Val)
            count  
            if cur.Left!=nil{
                q1.push(cur.Left)
            }
            if cur.Right!=nil{
                q1.push(cur.Right)
            }
        }
        q=q1
        avg=append(avg,sum/float64(count))
    }
    return avg
}

type queue struct{
    data []*TreeNode
}

func (q*queue)push(r *TreeNode){
    q.data=append(q.data,r)
}

func (q*queue)pop()*TreeNode{
    l:=len(q.data)
    var r *TreeNode
    if l>0{
        r=q.data[0]
        q.data=q.data[1:]
    }
    return r
}

func (q*queue)empty()bool{
    return len(q.data)<=0
}

0 人点赞