-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path1161-Maximum_Level_Sum_of_a_Binary_Tree.java
More file actions
132 lines (119 loc) · 3.28 KB
/
1161-Maximum_Level_Sum_of_a_Binary_Tree.java
File metadata and controls
132 lines (119 loc) · 3.28 KB
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*******************************************************************************
* 1161-Maximum_Level_Sum_of_a_Binary_Tree.java
* Billy.Ljm
* 15 June 2023
*
* =======
* Problem
* =======
* https://leetcode.com/problems/maximum-level-sum-of-a-binary-tree/
*
* Given the root of a binary tree, the level of its root is 1, the level of its
* children is 2, and so on.
*
* Return the smallest level x such that the sum of all the values of nodes at
* level x is maximal.
*
* ===========
* My Approach
* ===========
* We'll use breadth-first search to explore the binary tree level by level,
* stopping at each to calculate the sum of all values and remembering the
* maximum sum.
*
* This would have a time complexity of O(n) and space complexity of O(b), where
* n is the number of nodes in the tree
******************************************************************************/
import java.util.Arrays;
import java.util.Queue;
import java.util.LinkedList;
/**
* Definition for a binary tree node.
*/
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
class Solution {
public int maxLevelSum(TreeNode root) {
int maxLayer = 0; // layer with maximum sum
long maxSum = Long.MIN_VALUE; // maximum level sum
int currLayer = 0; // current layer
long currSum; // current level sum
int layerSize; // size of current layer
// breadth-first search
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()) {
// sum current layer
currLayer++;
currSum = 0L;
layerSize = queue.size();
for (int i = 0; i < layerSize; i++) {
TreeNode node = queue.poll();
currSum += node.val;
// queue next layer
if (node.left != null) queue.add(node.left);
if (node.right != null) queue.add(node.right);
}
// remember layer with maximum sum;
if (currSum > maxSum) {
maxLayer = currLayer;
maxSum = currSum;
}
}
return maxLayer;
}
}
class Test {
/**
* Create binary tree from array of integers
*/
private static TreeNode createTree(Integer[] array) {
TreeNode root = new TreeNode(array[0]); // root of tree
// queue of nodes to add children to
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
// iteratively add remaining nodes
TreeNode node = root;
for(int i = 1; i < array.length; i++) {
if (array[i] == null) continue;
else if (i % 2 == 1) {
node = queue.poll();
node.left = new TreeNode(array[i]);
queue.add(node.left);
}
else {
if(array[i] != null) node.right = new TreeNode(array[i]);
queue.add(node.right);
}
}
return root;
}
/**
* Test cases
*/
public static void main(String[] args) {
Solution sol = new Solution();
Integer[] nodes;
TreeNode root;
// test case 1
nodes = new Integer[] {1, 7, 0, 7, -8, null, null};
root = createTree(nodes);
System.out.println("maxLevelSum(" + Arrays.toString(nodes) + ") = "
+ sol.maxLevelSum(root));
// test case 2
nodes = new Integer[] {989,null,10250,98693,-89388,null,null,null,-32127};
root = createTree(nodes);
System.out.println("maxLevelSum(" + Arrays.toString(nodes) + ") = "
+ sol.maxLevelSum(root));
}
}