给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
代码语言: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].
注意:
- 节点值的范围在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
}