-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAvgLevelResolver.java
101 lines (81 loc) · 2.54 KB
/
AvgLevelResolver.java
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package org.sean.tree;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import static org.sean.utils.MathLib.log2;
/***
* 637. Average of Levels in Binary Tree
*
* Input:
* 3
* / \
* 9 20
* / \
* 15 7
* Output: [3, 14.5, 11]
*/
public class AvgLevelResolver {
/***
* @see {@link LevelTraversalSolution}
*/
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> resultList = new LinkedList<List<Integer>>();
if (root == null) {
return resultList;
}
if (root.left == null && root.right == null) {
List<Integer> list = Arrays.asList(root.val);
resultList.add(list);
return resultList;
}
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(root);
LinkedList<Integer> sequences = new LinkedList<>();
sequences.add(1);
int count = 0;
while (queue.size() > 0) {
TreeNode node = queue.remove();
count = sequences.remove();
//++count;
if (node != null) {
int index = log2(count);
// As the list grows step by step, preserve the order when inserting a group
if (resultList.size() != 1 + index) {
List<Integer> lt = new LinkedList<>();
lt.add(node.val);
resultList.add(0, lt);
} else {
resultList.get(0).add(node.val);
}
if (node.left != null) {
sequences.add(count * 2);
queue.add(node.left);
}
if (node.right != null) {
sequences.add(count * 2 + 1);
queue.add(node.right);
}
}
}
return resultList;
}
private void addAvgValue(LinkedList<Double> result, List<Integer> target) {
int cnt = target.size();
double total = .0;
for (Integer i : target) {
total += i;
}
result.add(total / cnt);
}
public List<Double> averageOfLevels(TreeNode root) {
LinkedList<Double> result = new LinkedList<>();
List<List<Integer>> elemList = levelOrderBottom(root);
int len = elemList.size();
for (int j = len - 1; j >= 0; j--) {
List<Integer> list = elemList.get(j);
addAvgValue(result, list);
}
return result;
}
}