Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
271 views
in Technique[技术] by (71.8m points)

一个算法的输出问题问题

题目的意思是子节点需要用()来包裹。举例来说,二叉树[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]!='')  //统计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)='';
    return str;
}
我如果使用, memset(str,0,sizeof(char)*MAXSIZE); 将每个位置初始化为0 ,就可以得出正确的结果,但是使用 len 统计字符的长度在加上结尾符'' , 就会出现 ! 

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
...