题目要求输出二叉树中所有根节点到叶子节点的路径,格式为["1->2->5", "1->3"]
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int inttochar(int n, char *ch, int length)
{
int i=0,temp,flag=0;
if(n==0)
{
ch[length-1]='0';
return 1;
}
if(n<0)
{
flag=-1;
n=-n;
}
while(n)
{
temp=n%10;
ch[length-1-i]=temp+'0';
n=n/10;
i++;
}
if(flag)
{
ch[length-1-i]='-';
i++;
}
return i;//返回长度
}
void newpath(struct TreeNode* root, int* returnSize, char* current, char** res, int length)
{
char a[11]={0};
int bits=inttochar(root->val,a,10);//数值位数
strcpy(current+length, a+10-bits); //拷贝节点值
if(root->left==NULL && root->right==NULL)//递归出口
{
res[*returnSize]=(char*)malloc(100);//新增一条路径
strcpy(res[*returnSize],current);//将current数组内容拷贝到路径串数组
*returnSize = *returnSize + 1;//路径计数加1
current[length]=0;//将current中这个节点记录删掉
return ;
}
length+=bits;
strcpy(current+length,"->");
length+=2;
if(root->left!=NULL)
{
newpath(root->left,returnSize,current,res,length);
}
if(root->right!=NULL)
{
newpath(root->right,returnSize,current,res,length);
}
length=length-2-bits; //中间节点“退栈”
current[length]=0;
}
char** binaryTreePaths(struct TreeNode* root, int* returnSize) {
*returnSize=0;
if(root==NULL)
{
char **r=(char **)malloc(sizeof(char*));
r[0]=&"";//返回指向空串地址的二级指针
return r;
}
char** result=(char **)malloc(sizeof(char*)*100);
char a[100]={0};
newpath(root,returnSize,a,result,0);
return result;
}
代码不是很精简,思维也比较乱,主要就是用一个数组起一个栈的作用保存当前的路径,用完就要退栈,好让后面的节点继续复用父节点的路径。需要注意的是节点的值可能为负,另外如果root为空,最后输出结果应为空串而不为NULL,这可能是LeetCode的一个规定,NULL就是啥输出也没有,空串就是[]。这里的二维指针输出空串用了&"",这也是醉了,但直接用char **r=&""不行。
然后自己编程过程中的几个常犯的毛病,一是使用指针类型传入的变量时不记得取值(*),二是思维混乱,想到哪写到哪,还写错变量。平时要多加注意。