★ 题目
https://leetcode.com/problems/binary-tree-level-order-traversal/description/
Given a binary tree, return the level order traversal of its nodes’ values. (ie, from left to right, level by level).
For example:
Given binary tree [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
return its level order traversal as:
[
[3],
[9,20],
[15,7]
]
★ 代码
34 / 34 test cases passed.
Runtime: 5 ms
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *columnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
#define max(a,b) (((a) > (b))?(a):(b));
int getLevels(struct TreeNode* node) {
if (node == NULL) return 0;
int level1 = 0;
if (node->left) {
level1 = getLevels(node->left);
}
int level2 = 0;
if (node->right) {
level2 = getLevels(node->right);
}
return 1 + max(level1, level2);
}
// level:当前正在处理哪一层
void getEachLevelSize(struct TreeNode* node, int level, int levelCnt, int levelSizes[]) {
if (level >= levelCnt) return;
if (node == NULL) return;
levelSizes[level]++;
if (node->left != NULL) {
getEachLevelSize(node->left, level+1, levelCnt, levelSizes);
}
if (node->right != NULL) {
getEachLevelSize(node->right, level+1, levelCnt, levelSizes);
}
}
// level:当前正在处理哪一层
void traverse(struct TreeNode* node, int level, int levelCnt, int *levelSizes, int** result) {
if (level >= levelCnt) return;
if (node == NULL) return;
result[level][levelSizes[level]++] = node->val;
if (node->left != NULL) {
traverse(node->left, level+1, levelCnt, levelSizes, result);
}
if (node->right != NULL) {
traverse(node->right, level+1, levelCnt, levelSizes, result);
}
}
int** levelOrder(struct TreeNode* root, int** columnSizes, int* returnSize) {
int levelCnt = getLevels(root);
*returnSize = levelCnt;
// levelSizes: 每一层数据的个数
int *levelSizes = (int*)malloc(levelCnt * sizeof(int));
for (int i = 0; i < levelCnt; i++) {
levelSizes[i] = 0;
}
getEachLevelSize(root, 0, levelCnt, levelSizes);
int** result = (int**)malloc(levelCnt*sizeof(int*));
for(int i = 0; i < levelCnt; i++) {
//printf("levelSizes[%d]: %d\n", i, levelSizes[i]);
int size = levelSizes[i] * sizeof(int);
result[i] = (int*)malloc(size);
memset(result[i], 0, size);
}
for (int i = 0; i < levelCnt; i++) {
levelSizes[i] = 0;
}
traverse(root, 0, levelCnt, levelSizes, result);
*columnSizes = levelSizes;
return result;
}