leetcode107解题思路
本题与之前102题的思路时一样的,102题存储的数续倒转就行。
int** levelOrderBottom(struct TreeNode* root, int** columnSizes, int* returnSize)
//还是从函数接口分析,root为树的根节点,根据题意需要传出按层次(从叶子到根)遍历该树的结果,一个二维的数组,但是单纯的返回这个数组是没有太大意义的。因此它需要传出这个数组对应的数据。columnSizes是存储那个二维数组每一行有多少个元素,returnSize是存储总共有多少行。他们作为形参传入函数,为了保留他们的值,确不能使用return返回,函数只能有一个返回值。所以需要传入一个指针来达到修改的目的。
举个例子
int swap (int a, int b) {
int temp = a;
a = b;
b = temp;
return 1
}
这个函数用于交换两个形参的值,但是在函数结束之后他们就被释放掉了,a, b的值时不会被交换的。一种解决办法就是将传入参数转换为指针,这样变量的改变就会被保留下来。
//具体的代码与我之前的博客区别不大,不懂的可以查看leetcode102题的解题思路。
int maxDepth (struct TreeNode *root) {
if (root == NULL) {
return 0;
}
int ld = maxDepth(root->left);
int rd = maxDepth(root->right);
return (ld > rd ? ld : rd) + 1;
}
void every_nums(struct TreeNode *root, int k, int *arr) {
if (root == NULL) {
return ;
}
arr[k] += 1;
every_nums(root->left, k + 1, arr);
every_nums(root->right, k + 1, arr);
}
void fetch_result(struct TreeNode *root, int k, int **ret, int *size, int depth) {
if (root == NULL) {
return ;
}
ret[depth - k - 1][size[depth - k - 1]++] = root->val;
fetch_result(root->left, k + 1, ret, size, depth);
fetch_result(root->right, k + 1, ret, size, depth);
return ;
}//在这个地方多传入了一个树的深度参数。
int** levelOrderBottom(struct TreeNode* root, int** columnSizes, int* returnSize) {
int depth = maxDepth(root);
int *size = (int *)malloc(sizeof(int) * depth);
memset(size, 0, sizeof(int) * depth);
//刚开始我使用memset(size, 0, sizeof(size))报错了,因为size时动态申请的,这样是不合法的。
every_nums(root, 0, size);
int **ret = (int **)malloc(sizeof(int *) * depth);
for (int i = 0; i < depth; ++i) {
ret[i] = (int *)malloc(sizeof(int) * size[depth - i - 1]);
size[depth -i - 1] = 0;
}
fetch_result(root, 0, ret, size, depth);
*returnSize = depth;
*columnSizes = size;
return ret;
}