这道题利用深度优先遍历算法,与其他类似的题大同小异。只是在一段时间没刷题后,对一些语法的使用不是很确定了。这道题卡在了给辅助指针的最后一位加上’\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;
}