-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path1161.c
91 lines (80 loc) · 1.89 KB
/
1161.c
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
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <limits.h>
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
struct Queue {
int start;
int end;
struct TreeNode **array;
};
struct Queue *create(int size);
int size(struct Queue *q);
bool isEmpty(struct Queue *q);
void push(struct Queue *q, struct TreeNode *k);
struct TreeNode *pop(struct Queue *q);
void qFree(struct Queue *q);
int maxLevelSum(struct TreeNode *root);
struct Queue *create(int size)
{
struct Queue *res;
if (!(res = (struct Queue *)malloc(sizeof(struct Queue))) || !(res->array = (struct TreeNode **)malloc(size * sizeof(struct TreeNode *))))
return NULL;
res->start = res->end = 0;
return res;
}
int size(struct Queue *q)
{
return q->end - q->start;
}
bool isEmpty(struct Queue *q)
{
return !size(q);
}
void push(struct Queue *q, struct TreeNode *k)
{
if (k) q->array[q->end++] = k;
}
struct TreeNode *pop(struct Queue *q)
{
return isEmpty(q) ? NULL : q->array[q->start++];
}
void qFree(struct Queue *q)
{
free(q->array);
free(q);
}
int maxLevelSum(struct TreeNode *root)
{
struct Queue *q;
struct TreeNode *node;
int res = 1;
if (!(q = create(10000)))
return -1;
push(q, root);
for (int level = 1, maxSum = INT_MIN, sum; !isEmpty(q); level++) {
sum = 0;
for (int i = 0, loop = size(q); i < loop; i++) {
node = pop(q);
sum += node->val;
push(q, node->left);
push(q, node->right);
}
if (maxSum < sum) {
maxSum = sum;
res = level;
}
}
qFree(q);
return res;
}
int main()
{
struct TreeNode node4 = {-8, NULL, NULL}, node3 = {7, NULL, NULL}, node2 = {0, NULL, NULL}, node1 = {7, &node3, &node4}, head = {1, &node1, &node2};
printf("%d\n", maxLevelSum(&head));
return 0;
}