// 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
}