簡體   English   中英

給定二叉樹,返回所有從根到葉的路徑

[英]Given a binary tree, return all root-to-leaf paths

我正在嘗試在c https://leetcode.com/problems/binary-tree-paths/中的 leetcode上解決此問題。 該代碼適用於小型測試用例。 但是對於較大的服務器,則顯示運行時錯誤。 我曾嘗試增加數組的大小,但無濟於事。 請幫忙。

程序失敗的測試用例是:

[-64,12,18,-4,-53,null,76,null,-51,null,null,-93,3,null,-31,47,null,3,53,-81,33, 4,null,-51,-44,-60,11,null,null,null,null,78,null,-35,-64,26,-81,-31,27,60,74,null,null ,8,-38,47,12,-24,null,-59,-49,-11,-51,67,null,null,null,null,null,null,null,-67,null,-37 ,-19,10,-55,72,null,null,null,-70,17,-4,null,null,null,null,null,null,null,null,3,80,44,-88,-91 null,48,-90,-30,null,null,90,-34,37,null,null,73,-38,-31,-85,-31,-96,null,null,-18, 67,34,72,null,-17,-77,null,56,-65,-88,-53,null,null,null,-33,86,null,81,-42,null,null,98 ,-40,70,-26,24,null,null,null,null,92,72,-27,null,null,null,null,null,null,-67,null,null,null,null,null ,null,null,-54,-66,-36,null,-72,null,null,43,null,null,null,-92,-1,-98,null,null,null,null,null, null,null,39,-84,null,null,null,null,null,null,null,null,null,null,null,null,null,-93,null,null,null,98

int height(struct TreeNode* root){
    if(root == NULL)
        return 0;
    if(root->left == NULL && root->right == NULL)
        return 1;
    int left = height(root->left);
    int right = height(root->right);
    return left> right? left+1: right+1;
} 

void util(char **result, struct TreeNode* root, int i, int *r, char* temp){
    i+= sprintf(temp+i, "%d", root->val);
    printf("%d ",*r);
    if(!root->left && !root->right){
        sprintf(result[(*r)++],"%s", temp);
    }
    i+= sprintf(temp+i, "->");
    if(root->left){
        util(result, root->left, i, r, temp);
    }
    if(root->right){
        util(result, root->right, i, r, temp);
    }
}

char** binaryTreePaths(struct TreeNode* root, int* returnSize) {
    if(root == NULL)
        return NULL;
    int ht = height(root);
    int width = pow(2,ht-1);
    char **result = malloc((width+1)* sizeof(char *));
    int i, r=0;
    char *temp = malloc((height+1)* sizeof(char));
    for(i=0; i<=ht; i++)
        result[i] = malloc((height+1) * sizeof(char));
    util(result, root, 0, &r, temp);
    *returnSize = r;
    return result;
}

temp數組和result每個條目都應分配給更大的大小:它必須能夠容納height+1十進制整數值+ 2個字符+一個最終的'\\0' height+1太小了。

假設32位整數,請嘗試以下操作:

int length = (ht + 1) * 12;
char *temp = malloc(length);
for (i = 0; i <= ht; i++)
    result[i] = malloc(length);

您可以通過分配存儲在result數組中的每個路徑來減少所使用的內存量。 為此,請從binaryPaths刪除上述for循環,並在util中修改將路徑存儲在result

if (!root->left && !root->right) {
    result[(*r)++] = strdup(temp);
}

這是一種更好的方法,因為您不返回實際分配的大小,而僅返回路徑數,因此result額外條目將無法訪問且無法釋放。

並且請記住在從binaryTreePaths返回之前釋放temp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM