char * 申请空间要多一位 && leetcode.22括号生成(C语言)

这道题利用深度优先遍历算法,与其他类似的题大同小异。只是在一段时间没刷题后,对一些语法的使用不是很确定了。这道题卡在了给辅助指针的最后一位加上’\0’,再进行strcpy。这样就保证最终结果不会出现溢出错误。特此记录一下。

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
 ///建立一个树结构体
typedef struct BiTnode{
    int leftnum;
    int rightnum;
    struct BiTnode *left, *right;
}BiTnode,*Bitree;

///初始化树的当前节点
void initNode(Bitree T,int left, int right){
    T->leftnum = left;
    T->rightnum = right;
    T->left = NULL;
    T->right = NULL;
}

void createTree(Bitree T, char **res, char *arrays, int k, int n, int *returnSize){
    剪枝,如果“("的剩余数量大于“)”的剩余数量,则永远无法生成有效的括号组合,直接返回。
    if(T->leftnum > T->rightnum){
        return;
    }
    ///k用来表示当前辅助数组的位置,加入辅助数组长度k-1 == n*2,代表着所有括号都被写入数组里面了并且合法,即T->leftnum == T->rightnum == 0;
    if(k == n*2){
        res[*returnSize] = (char *)malloc(sizeof(char)*(k+1));
        ///这一步非常重要,char * 类型本来就要多申请一位给'\0'作为结束标志。
        arrays[k] ='\0';
        ///将辅助数组的元素(包括'\0'一并赋值给最终需要返回的指针。
        strcpy(res[(*returnSize)++], arrays);
        return;
    }
    ///接下来两个步骤就是树的构建方法,左右子树建立的方法室一样的。
    if(T->leftnum > 0){
        T->left = (Bitree)malloc(sizeof(struct BiTnode));
        initNode(T->left, (T->leftnum)-1, T->rightnum);
        arrays[k]='(';
        //printf("%d,%c",k,arrays[k]);
        createTree(T->left, res, arrays, k+1, n, returnSize);
    }
    if(T->rightnum > 0){
        T->right = (Bitree)malloc(sizeof(struct BiTnode));
        initNode(T->right, T->leftnum, (T->rightnum)-1);
        arrays[k]=')';
        arrays[k+1]='\0';
        //printf("%d,%c",k,arrays[k]);
        createTree(T->right, res, arrays, k+1, n, returnSize);
    }
}

char ** generateParenthesis(int n, int* returnSize){
    char ** res = (char **)malloc(sizeof(char *)*5000);
    Bitree root = (Bitree)malloc(sizeof(struct BiTnode));
    char *arr = (char *)malloc(sizeof(char)*(2*n+1));
    (*returnSize) = 0;
    initNode(root,n,n);
    createTree(root, res, arr, 0, n, returnSize); 
    return res;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值