描述
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组.
示例 1:
1 2 3 4 5 6 7 8 9 10
| 输入: 3 / \ 9 20 / \ 15 7 输出: [3, 14.5, 11]
解释: 第0层的平均值是 3, 第1层是 14.5, 第2层是 11. 因此返回 [3, 14.5, 11].
|
注意:
节点值的范围在32位有符号整数范围内。
来源:力扣(LeetCode)
链接:637. Average of Levels in Binary Tree
解题思路
本题依然考察二叉树的层次遍历,可以在102. 二叉树的层次遍历的基础上将各层数据的平均值求出来。
首先来看迭代的解法,具体见解法一,里面有详细的注释。
换一种循环的方式,可以有另外一种迭代的解法,具体见解法二。
如果采用递归的话,显然本题要写一个辅助函数,思考要传入什么参数,是传值还是传引用,需不需要返回参数,需要的话要返回什么参数等等的问题。
代码
解法一:迭代
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 133 134 135 136
|
#define QMAX 10024 typedef struct TreeNode* Tree;
typedef struct Queue { Tree Node[QMAX]; int front; int rear; }Queue;
void Qinit(Queue *q) { q->front = q->rear = 0; }
bool isFull(Queue *q) { return ((q->rear + 1) % QMAX == q->front); }
bool isEmpty(Queue *q) { return q->rear == q->front; }
bool push(Queue *q, Tree node) { if(isFull(q)) return false; q->Node[q->rear] = node; q->rear = (q->rear + 1) % QMAX; return true; }
Tree pop(Queue *q) { if(isEmpty(q)) { return NULL; } Tree node; node = q->Node[q->front]; q->front = (q->front + 1) % QMAX; return node; }
double* averageOfLevels(struct TreeNode* root, int* returnSize) { int count = 0, size = 0; double sum; double* ave = (double *)malloc(sizeof(double) * QMAX); *returnSize = 0; Queue queue; Qinit(&queue); if(!root) { return NULL; } else { push(&queue, root); ave[0] = root->val; } while(!isEmpty(&queue)) { count = queue.rear - queue.front; size = count; sum = 0.0; while(size > 0) { root = pop(&queue); sum += root->val; if(root->left) { push(&queue, root->left); } if(root->right) { push(&queue, root->right); } size--; } ave[(*returnSize)++] = sum / count; } return ave; }
|
解法二:迭代
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 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
#define QMAX 10024 typedef struct TreeNode* Tree;
typedef struct Queue { Tree Node[QMAX]; int front; int rear; }Queue;
void Qinit(Queue *q) { q->front = q->rear = 0; }
bool isFull(Queue *q) { return ((q->rear + 1) % QMAX == q->front); }
bool isEmpty(Queue *q) { return q->rear == q->front; }
bool push(Queue *q, Tree node) { if(isFull(q)) return false; q->Node[q->rear] = node; q->rear = (q->rear + 1) % QMAX; return true; }
Tree pop(Queue *q) { if(isEmpty(q)) { return NULL; } Tree node; node = q->Node[q->front]; q->front = (q->front + 1) % QMAX; return node; }
double* averageOfLevels(struct TreeNode* root, int* returnSize) { int count = 0, size = 0; double sum; double* ave = (double *)malloc(sizeof(double) * QMAX); *returnSize = 0; int *level = (int *)calloc(1, sizeof(int) * QMAX); int height = 0; level[height] = 1; Queue queue; Qinit(&queue); if(!root) { return NULL; } else { push(&queue, root); ave[0] = root->val; } while (!isEmpty(&queue)) { height++; count = level[height - 1]; sum = 0.0; for (int i = 0; i< level[height - 1]; i++) { root = pop(&queue); sum += root->val; if (root->left) { push(&queue, root->left); level[height]++; } if (root->right) { push(&queue, root->right); level[height]++; } } ave[(*returnSize)++] = sum / count; } return ave; }
|
解法三:递归
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
|
typedef struct TreeNode* Tree;
int max(int a, int b) { if(a > b) return a; else return b; }
int maxDepth(Tree root) { if(!root) return 0; else return max(maxDepth(root->left), maxDepth(root->right)) + 1; }
void averageOfLevelsHelper(Tree root, int count, double* result, int* floorSize) { if (!root) return; floorSize[count] += 1; result[count] += root->val; ++count; averageOfLevelsHelper(root->left, count, result, floorSize); averageOfLevelsHelper(root->right, count, result, floorSize); }
double* averageOfLevels(Tree root, int* returnSize) { int count = maxDepth(root); double *result = malloc(sizeof(double)*count); int *floorSize = malloc(sizeof(int)*count); memset(result, 0, sizeof(double)*count); memset(floorSize, 0, sizeof(int)*count); averageOfLevelsHelper(root, 0, result, floorSize); *returnSize = count; for (int i = 0; i < count; ++i) result[i] = result[i]/floorSize[i]; return result; }
|
参考