题目的意思是子节点需要用()
来包裹。举例来说,二叉树[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' , 就会出现 !
没有初始化的str ,中的值是任意的但存入了字符后就可以确定了,为什么会出现这种情况呢 ? ,希望指点一下;
这个问题和算法没有关系。这个问题点在 malloc 方法上。 malloc 是从堆里面分配一块内存,然后就返回了,但是不会关心这块内存里面之前存的是什么(一般就是乱码)。所以malloc 之后如果需要用,可以memset 一下。