leetcode107c语言解题思路

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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值