LeetCode Binary Tree Path

题目要求输出二叉树中所有根节点到叶子节点的路径,格式为["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=&""不行。

然后自己编程过程中的几个常犯的毛病,一是使用指针类型传入的变量时不记得取值(*),二是思维混乱,想到哪写到哪,还写错变量。平时要多加注意。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值