Day13 Golang (二叉树)二叉树的层序遍历题组

// 102.二叉树的层序遍历
package main

import (
	"container/list"
	"fmt"
)

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

func levelOrder(root *TreeNode) [][]int {
	res := [][]int{}
	que := list.New()
	if root != nil {
		que.PushBack(root)
	} else {
		return nil
	}
	for que.Len() > 0 {
		length := que.Len() //记录每层结点的数量
		res_row := []int{}  //存放每层结点的值
		for length > 0 {
			node := que.Remove(que.Front()).(*TreeNode) //队首结点出队列
			res_row = append(res_row, node.Val)
			//加入出列结点的左右孩子
			if node.Left != nil {
				que.PushBack(node.Left)
			}
			if node.Right != nil {
				que.PushBack(node.Right)
			}

			length--
		}
		res = append(res, res_row)
	}
	return res
}

func main() {
	//k=3
	node1, node2, node3, node4 := TreeNode{1, nil, nil}, TreeNode{2, nil, nil}, TreeNode{7, nil, nil}, TreeNode{8, nil, nil}
	//k=2
	node5, node6 := TreeNode{4, &node1, &node2}, TreeNode{6, &node3, &node4}
	//k=1
	node7 := TreeNode{5, &node5, &node6}
	res := levelOrder(&node7)
	fmt.Printf("res: %v\n", res)//res: [[5] [4 6] [1 2 7 8]]
}
// 05 107.二叉树的层次遍历II(opens new window)
package main

import (
	"container/list"
	"fmt"
)

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

func levelOrderBottom(root *TreeNode) [][]int {
	res := [][]int{}
	que := list.New()
	if root != nil {
		que.PushBack(root)
	} else {
		return nil
	}
	for que.Len() > 0 {
		res_row := []int{}
		length := que.Len()
		for length > 0 {
			val := que.Remove(que.Front()).(*TreeNode)
			res_row = append(res_row, val.Val)
			if val.Left != nil {
				que.PushBack(val.Left)
			}
			if val.Right != nil {
				que.PushBack(val.Right)
			}
			length--
		}
		res = append(res, res_row)
	}
	for i, j := 0, len(res)-1; i < len(res)/2; i++ { //反转数组
		res[i], res[j] = res[j], res[i]
		j--
	}
	return res
}

func main() {
	//k=3
	node1, node2, node3, node4 := TreeNode{1, nil, nil}, TreeNode{2, nil, nil}, TreeNode{7, nil, nil}, TreeNode{8, nil, nil}
	//k=2
	node5, node6 := TreeNode{4, &node1, &node2}, TreeNode{6, &node3, &node4}
	//k=1
	node7 := TreeNode{5, &node5, &node6}
	res := levelOrderBottom(&node7)
	fmt.Printf("res: %v\n", res) //res: [[1 2 7 8] [4 6] [5]]
}
// 06 199.二叉树的右视图
package main

import (
	"container/list"
	"fmt"
)

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

func rightSideView(root *TreeNode) []int {
	res := [][]int{}
	que := list.New()
	result := []int{}
	if root != nil {
		que.PushBack(root)
	} else {
		return nil
	}
	for que.Len() > 0 {
		length := que.Len()
		res_row := []int{}
		for length > 0 {
			val := que.Remove(que.Front()).(*TreeNode)
			res_row = append(res_row, val.Val)
			if val.Left != nil {
				que.PushBack(val.Left)
			}
			if val.Right != nil {
				que.PushBack(val.Right)
			}
			length--
		}
		res = append(res, res_row)
	}
	for _, v := range res { //取每一个数组最后一个元素
		result = append(result, v[len(v)-1])
	}
	return result
}

func main() {
	//k=3
	node1, node2, node3, node4 := TreeNode{1, nil, nil}, TreeNode{2, nil, nil}, TreeNode{7, nil, nil}, TreeNode{8, nil, nil}
	//k=2
	node5, node6 := TreeNode{4, &node1, &node2}, TreeNode{6, &node3, &node4}
	//k=1
	node7 := TreeNode{5, &node5, &node6}
	res := rightSideView(&node7)
	fmt.Printf("res: %v\n", res) //res: [5 6 8]
}
// 07 637.二叉树的层平均值(opens new window)
package main

import (
	"container/list"
	"fmt"
)

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

func averageOfLevels(root *TreeNode) []float64 {
	res := [][]int{}
	que := list.New()
	result := []float64{}
	if root != nil {
		que.PushBack(root)
	} else {
		return nil
	}
	for que.Len() > 0 {
		length := que.Len()
		res_row := []int{}
		for length > 0 {
			val := que.Remove(que.Front()).(*TreeNode)
			res_row = append(res_row, val.Val)
			if val.Left != nil {
				que.PushBack(val.Left)
			}
			if val.Right != nil {
				que.PushBack(val.Right)
			}
			length--
		}
		res = append(res, res_row)
	}
	for _, v := range res {
		add := 0.0
		for _, v2 := range v {
			add += float64(v2)
		}
		result = append(result, add/float64(len(v)))
	}
	return result
}

func main() {
	//k=3
	node1, node2, node3, node4 := TreeNode{1, nil, nil}, TreeNode{2, nil, nil}, TreeNode{7, nil, nil}, TreeNode{8, nil, nil}
	//k=2
	node5, node6 := TreeNode{4, &node1, &node2}, TreeNode{6, &node3, &node4}
	//k=1
	node7 := TreeNode{5, &node5, &node6}
	res := averageOfLevels(&node7)
	fmt.Printf("res: %v\n", res) //res: [5 6 8]
}
//08 429.N叉树的层序遍历(opens new window)
package main

import (
	"container/list"
	"fmt"
)

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

func levelOrder(root *Node) [][]int {
	res := [][]int{}
	que := list.New()
	if root != nil {
		que.PushBack(root)
	} else {
		return nil
	}
	for que.Len() > 0 {
		length := que.Len()
		res_row := []int{}
		for length > 0 {
			val := que.Remove(que.Front()).(*Node)
			res_row = append(res_row, val.Val)
			for _, v := range val.Children { //将该结点的所有的子结点压入栈
				if v != nil {
					que.PushBack(v)
				}
			}
			length--
		}
		res = append(res, res_row)
	}
	return res
}

func main() {
	//k=3
	node5, node6 := Node{5, nil}, Node{2, nil}
	//k=2
	node3 := Node{3, []*Node{&node5, &node6}} //注意这里的切片赋值
	node2 := Node{2, nil}
	node4 := Node{4, nil}
	//k=1
	node1 := Node{1, []*Node{&node3, &node2, &node4}}
	res := levelOrder(&node1)
	fmt.Printf("res: %v\n", res)//res: [[1] [3 2 4] [5 2]]

}
// 515.在每个树行中找最大值(opens new window)
package main

import (
	"container/list"
	"fmt"
	"math"
)

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

func largestValues(root *TreeNode) []int {
	res := []int{}
	que := list.New()
	if root != nil {
		que.PushBack(root)
	} else {
		return nil
	}
	for que.Len() > 0 {
		length := que.Len()   //记录每层结点的数量
		res_row := []int{}    //存放每层结点的值
		temp := math.MinInt64 //临时变量保存每层的最大值,初始化为最小的Int64数
		for length > 0 {
			node := que.Remove(que.Front()).(*TreeNode) //队首结点出队列
			res_row = append(res_row, node.Val)
			temp = Max(temp, node.Val) //注意math.Max的用法
			//加入出列结点的左右孩子
			if node.Left != nil {
				que.PushBack(node.Left)
			}
			if node.Right != nil {
				que.PushBack(node.Right)
			}

			length--
		}
		res = append(res, int(temp))
	}
	return res
}
func Max(x int, y int) int {
	if x < y {
		return y
	} else {
		return x
	}
}
func main() {
	//k=3
	node1, node2, node3, node4 := TreeNode{1, nil, nil}, TreeNode{2, nil, nil}, TreeNode{7, nil, nil}, TreeNode{8, nil, nil}
	//k=2
	node5, node6 := TreeNode{4, &node1, &node2}, TreeNode{6, &node3, &node4}
	//k=1
	node7 := TreeNode{5, &node5, &node6}
	res := largestValues(&node7)
	fmt.Printf("res: %v\n", res)
}
// 116.填充每个节点的下一个右侧节点指针(opens new window)
// 117.填充每个节点的下一个右侧节点指针II
package main

import (
	"container/list"
	"fmt"
)

type Node struct {
	Val   int
	Left  *Node
	Right *Node
	Next  *Node
}

func connect(root *Node) *Node {
	que := list.New()
	if root != nil {
		que.PushBack(root)
	} else {
		return nil
	}
	for que.Len() > 0 {
		length := que.Len()
		que_row := make([]*Node, 0)
		for length > 0 {
			val := que.Remove(que.Front()).(*Node)
			que_row = append(que_row, val)
			if val.Left != nil {
				que.PushBack(val.Left)
			}
			if val.Right != nil {
				que.PushBack(val.Right)
			}
			length--
		}
		for i, _ := range que_row { //遍历每一层结点
			if i < len(que_row)-1 {
				que_row[i].Next = que_row[i+1] //结点指向下一个结点
			} else {
				que_row[i].Next = nil //最后一个结点指向空
			}

		}
	}
	return root
}

func main() {
	//k=3
	node1, node2, node3, node4 := Node{1, nil, nil, nil}, Node{2, nil, nil, nil}, Node{7, nil, nil, nil}, Node{8, nil, nil, nil}
	//k=2
	node5, node6 := Node{4, &node1, &node2, nil}, Node{6, &node3, &node4, nil}
	//k=1
	node7 := Node{5, &node5, &node6, nil}
	res := connect(&node7)
	fmt.Printf("res: %v\n", res) //res: &{5 0xc000052440 0xc000052460 <nil>}
}
// 104.二叉树的最大深度(opens new window)
package main

import (
	"container/list"
	"fmt"
)

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

func maxDepth(root *TreeNode) int {
	que := list.New()
	depth := 0
	que.PushBack(root) //根结点入队列
	if root == nil {   //注意排除空结点的情况
		return 0
	}
	for que.Len() > 0 {
		length := que.Len()
		for length > 0 {
			val := que.Remove(que.Front()).(*TreeNode)
			if val.Left != nil {
				que.PushBack(val.Left)
			}
			if val.Right != nil {
				que.PushBack(val.Right)
			}
			length--
		}
		depth++
	}
	return depth
}

func main() {
	//k=3
	node1, node2, node3, node4 := TreeNode{1, nil, nil}, TreeNode{2, nil, nil}, TreeNode{7, nil, nil}, TreeNode{8, nil, nil}
	//k=2
	node5, node6 := TreeNode{4, &node1, &node2}, TreeNode{6, &node3, &node4}
	//k=1
	node7 := TreeNode{5, &node5, &node6}
	res := maxDepth(&node7)
	fmt.Printf("res: %v\n", res)
}
// 111.二叉树的最小深度
package main

import (
	"container/list"
	"fmt"
)

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

func minDepth(root *TreeNode) int {
	if root == nil { //注意排除空结点的情况
		return 0
	}
	que := list.New()
	depth := 1
	que.PushBack(root) //根结点入队列
	if root == nil {   //注意排除空结点的情况
		return 0
	}
	for que.Len() > 0 {
		length := que.Len()
		for length > 0 {
			val := que.Remove(que.Front()).(*TreeNode)
			if val.Left == nil && val.Right == nil { //如果遍历到叶子结点,直接返回深度
				return depth
			}
			if val.Left != nil {
				que.PushBack(val.Left)
			}
			if val.Right != nil {
				que.PushBack(val.Right)
			}
			length--
		}
		depth++
	}
	return depth
}

func main() {
	//k=3
	node1, node2, node3, node4 := TreeNode{1, nil, nil}, TreeNode{2, nil, nil}, TreeNode{7, nil, nil}, TreeNode{8, nil, nil}
	//k=2
	node5, node6 := TreeNode{4, &node1, &node2}, TreeNode{6, &node3, &node4}
	//k=1
	node7 := TreeNode{5, &node5, &node6}
	res := minDepth(&node7)
	fmt.Printf("res: %v\n", res) //res: 3
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值