二叉树基础之层序遍历
总结解题思路:层序遍历,将每一层的节点放入队列中,而这个队列是个临时队列,在每次使用或者遍历之后给删除了,继续进行下一层次的遍历,通过遍历队列的size则就得到节点的数据
//层序遍历
func levelOrder(root *TreeNode) [][]int {
var res [][]int
st := list.New()
if root!=nil{
st.PushBack(root)
}
var temp []int
for st.Len()>0{
len:=st.Len()
for i := 0; i < len; i++ {
node := st.Remove(st.Front()).(*TreeNode)//先进先出原则
if node.Left!=nil{
st.PushBack(node.Left)
}
if node.Right != nil{
st.PushBack(node.Right)
}
temp=append(temp, node.Val)
}
res=append(res, temp)
temp=[]int{}
}
return res
}
二叉树的层平均值
//637.二叉树的层平均值
func averageOfLevels(root *TreeNode) []float64 {
st:=list.New()
if root!=nil{
st.PushBack(root)
}
var res []float64
var temp int
for st.Len()>0{
len:=st.Len()
for i := 0; i <len ; i++ {
node:=st.Remove(st.Front()).(*TreeNode)
if node.Right!=nil{
st.PushBack(node.Right)
}
if node.Left!=nil{
st.PushBack(node.Left)
}
temp=temp+node.Val
}
res=append(res, float64(temp)/float64(len))
temp=0
}
return res
}
填充每个节点的下一个右侧节点指针
116. 填充每个节点的下一个右侧节点指针
func connect(root *Node) *Node {
if root==nil{
return root
}
arr:= []*Node{root}//数组
for len(arr)>0 {
temp:=arr
arr=nil
for i,o := range temp {//需要使用指针
if i+1<len(temp){
o.Next=temp[i+1]
}
if o.Left!=nil{
arr=append(arr, o.Left)
}
if o.Right!=nil{
arr=append(arr,o.Right)
}
}
}
return root
}
在每个树行中找最大值
//515.在每个树行中找最大值
func largestValues(root *TreeNode) []int {
l:=list.New()
if root!=nil{
l.PushBack(root)
}
var res []int
var temp int
for l.Len()>0{
len:=l.Len()
for i := 0; i < len; i++ {
node:=l.Remove(l.Front()).(*TreeNode)
if node.Right!=nil{
l.PushBack(node.Right)
}
if node.Left!=nil{
l.PushBack(node.Left)
}
temp=max(temp,node.Val)
}
res=append(res, temp)
temp=0
}
return res
}
//获取最大值
func max(a, b int) int {
if a > b {
return a
}
return b
}