一个算法的输出问题问题

题目的意思是子节点需要用()来包裹。举例来说,二叉树[root,left,right],则转换为root(left)(right)。如果只有left为空节点,则输出root()(right);如果只有right为空节点则可以忽略右节点的(),输出为root(left)

//先序遍历;

int len=0; //统计字符的个数;

void dfs(struct TreeNode *root ,char *str)

{

int val=0;

char tem[20]={0};

sprintf(tem, "%d",root->val); // 数字变字符;

while(tem[val]!='\0') //统计tem中的字符个数,树中的数据转字符的个数;

val++;

len+=val;

strcat(str,tem);

if(root==NULL)

return ;

if(root->left !=NULL && root->right!=NULL)

{

len+=4;

strcat(str ,"(") ;

dfs(root->left , str) ;

strcat(str ,")");

strcat(str ,"(");

dfs(root->right , str);

strcat(str ,")");

}

else if(root->left!=NULL && root->right==NULL)

{

len+=2;

strcat(str ,"(");

dfs(root->left , str);

strcat(str ,")");

}

else if(root->left==NULL && root->right!=NULL)

{

len+=4;

strcat(str ,"()");

strcat(str ,"(");

dfs(root->right , str);

strcat(str ,")");

}

}

#define MAXSIZE 100000

char * tree2str(struct TreeNode* t){

if(t==NULL)

return "";

char *str;

str=(char *)malloc(sizeof(char)*MAXSIZE);

// memset(str,0,sizeof(char)*MAXSIZE);

dfs(t,str );

printf("%d",len);

*(str+len)='\0';

return str;

}

我如果使用, memset(str,0,sizeof(char)*MAXSIZE); 将每个位置初始化为0 ,就可以得出正确的结果,但是使用 len 统计字符的长度在加上结尾符'\0' , 就会出现 ! 

QQ图片20200501153618.png
没有初始化的str ,中的值是任意的但存入了字符后就可以确定了,为什么会出现这种情况呢 ? ,希望指点一下;

回答:

这个问题和算法没有关系。这个问题点在 malloc 方法上。 malloc 是从堆里面分配一块内存,然后就返回了,但是不会关心这块内存里面之前存的是什么(一般就是乱码)。所以malloc 之后如果需要用,可以memset 一下。

回答:

malloc 函数其实就是在内存中:找一片指定大小的空间,然后将这个空间的首地址给一个指针变量。
malloc 分配的内存空间在逻辑上是连续的,而在物理上可以不连续。
malloc并不会对内存里的值做什么操作,就像初始化一个int变量,变量的值是随机的一样。

以上是 一个算法的输出问题问题 的全部内容, 来源链接: utcz.com/p/194345.html

回到顶部