1. 程式人生 > >leetcode102題C語言思路

leetcode102題C語言思路

int** levelOrder(struct TreeNode* root, int** columnSizes, int* returnSize) //從函式的介面分析,root為傳入引數,為樹的根節點。int** columnSizes, int* returnSize是傳出引數,retrunSize是樹的深度,columnSizes是陣列,是每行的節點的個數。

因為C不能傳出多個引數,因此需要保留改變值就必須引數實參,即傳入地址來達到修改的目的。也可以把他們看為一個數組,相當於取出陣列中的第一個元素。
首先需要得到數的深度,這個用遞迴很容易得到
int max_depth(struct
TreeNode* root) { if (root == NULL) return 0; int ld = max_depth(root->left); int rd = max_depth(root->right); return (ld > rd ? ld : rd) + 1; }

k為深度,對於樹的遍歷時,設定它可以讓程式更加合理,這個技巧需要較多的聯絡後才能理解

然後需要遍歷一遍樹,找到每一層右多少個節點,這是為了給二維陣列每一個位置申請空間的。
void calcColumnSizes(struct TreeNode *root, int
k, int *arr) { if (root == NULL) return ; arr[k] += 1; calcColumnSizes(root->left, k + 1, arr); calcColumnSizes(root->right, k + 1, arr); return ; }//也是通過遞迴實現的
void fetch_result(struct TreeNode *root, int k, int *ind, int **ret) {
    if (root == NULL) return ;
    ret[k][ind[k]++] = root->val;
    fetch_result(root->left, k + 1
, ind, ret); fetch_result(root->right, k + 1, ind, ret); return ; }//再次遍歷一遍,記錄每一層的節點

int** levelOrder(struct TreeNode* root, int** columnSizes, int* returnSize) {
    int depth = max_depth(root);
    int *sizes = (int *)calloc(depth, sizeof(int));
    calcColumnSizes(root, 0, sizes);    
    int **ret = (int **)malloc(sizeof(int *) * depth);
    for (int i = 0; i < depth; i++) {
        ret[i] = (int *)malloc(sizeof(int) * sizes[i]);
        sizes[i] = 0;//將size設為0可以節省一個數組空間
    }
    fetch_result(root, 0, sizes, ret);
    *columnSizes = sizes;
    *returnSize = depth;
    return ret;
}

//整體實現
int max_depth(struct TreeNode* root) {
if (root == NULL) return 0;
int ld = max_depth(root->left);
int rd = max_depth(root->right);
return (ld > rd ? ld : rd) + 1;
}

void calcColumnSizes(struct TreeNode *root, int k, int *arr) {
if (root == NULL) return ;
arr[k] += 1;
calcColumnSizes(root->left, k + 1, arr);
calcColumnSizes(root->right, k + 1, arr);
return ;
}

void fetch_result(struct TreeNode *root, int k, int *ind, int **ret) {
if (root == NULL) return ;
ret[k][ind[k]++] = root->val;
fetch_result(root->left, k + 1, ind, ret);
fetch_result(root->right, k + 1, ind, ret);
return ;
}

int** levelOrder(struct TreeNode* root, int** columnSizes, int* returnSize) {
int depth = max_depth(root);
int sizes = (int )calloc(depth, sizeof(int));
calcColumnSizes(root, 0, sizes);
int ret = (int )malloc(sizeof(int ) depth);
for (int i = 0; i < depth; i++) {
ret[i] = (int )malloc(sizeof(int) sizes[i]);
sizes[i] = 0;
}
fetch_result(root, 0, sizes, ret);
*columnSizes = sizes;
*returnSize = depth;
return ret;
}
“`