[英]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.