Средние значения уровней бинарного дерева
Условие задачи
Дано бинарное дерево. Сформируйте массив со средними значениями всех его уровней.
Решение
Задача следует паттерну обхода бинарного дерева по уровням. Выполняем обычный BFS, но вместо сохранения всех узлов уровня поддерживаем сумму их значений. После обработки уровня делим сумму на количество узлов и добавляем среднее значение в результат.
Код
Вот как будет выглядеть наш алгоритм:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package main
import "fmt"
type TreeNode struct {
Value int
Left *TreeNode
Right *TreeNode
}
func findLevelAverages(root *TreeNode) []float64 {
result := []float64{}
if root == nil {
return result
}
queue := []*TreeNode{root}
for len(queue) > 0 {
levelSize := len(queue)
levelSum := 0.0
for i := 0; i < levelSize; i++ {
currentNode := queue[0]
queue = queue[1:]
levelSum += float64(currentNode.Value)
if currentNode.Left != nil {
queue = append(queue, currentNode.Left)
}
if currentNode.Right != nil {
queue = append(queue, currentNode.Right)
}
}
result = append(result, levelSum/float64(levelSize))
}
return result
}
func main() {
root := &TreeNode{Value: 12}
root.Left = &TreeNode{Value: 7}
root.Right = &TreeNode{Value: 1}
root.Left.Left = &TreeNode{Value: 9}
root.Left.Right = &TreeNode{Value: 2}
root.Right.Left = &TreeNode{Value: 10}
root.Right.Right = &TreeNode{Value: 5}
fmt.Printf("Средние значения уровней: %v\n", findLevelAverages(root))
}
Вывод:
1
Средние значения уровней: [12 4 6.5]
Временная сложность
Временная сложность алгоритма равна \(O(N)\), где \(N\) — общее количество узлов в дереве.
Пространственная сложность
Для очереди требуется \(O(W)\) дополнительной памяти, где \(W\) — максимальная ширина дерева. Результат содержит по одному значению на уровень и занимает \(O(H)\) памяти, где \(H\) — высота дерева. Таким образом, суммарная пространственная сложность равна \(O(W + H)\), а в худшем случае — \(O(N)\).
Вариации задачи
Задача: найдите наибольшее значение на каждом уровне бинарного дерева.
Решение: используйте тот же обход, но вместо суммы отслеживайте максимальное значение текущего уровня.