用示例一表示
- 我们容易看出,我们只要将各数字对应的字母一一作为上一个数字的孩子,最后输出每一条路径,即为最终答案。
- 构造树的结构体
typedef struct Tree{
char data;
int childenNum;
struct Tree* childen[4];//号码对应字母不超过4
}Tree,*Bitree;
- 构造多叉树
void creatTree(Bitree* T,char*digits,int len)//len为digits长度
{
if(len>0)
{
int t=strlen(phoneMap[digits[0]-'0']);//当前数字对应字符数目个数
(*T)->childenNum=t;
for(int i=0;i<t;i++)
{
(*T)->childen[i]=(Bitree)malloc(sizeof(Tree));
(*T)->childen[i]->data=phoneMap[digits[0]-'0'][i];//digital[0]后面的后续操作使然
(*T)->childen[i]->childenNum=0;//子代的子代个数初始化为0
}
for(int i=0;i<t;i++)
{
creatTree(&(*T)->childen[i],digits+1,len-1);//为了方便,每次让digital往后移动一位
}
}
}
- 遍历多叉树,找出所有路径
void Creat(Bitree root,int* returnSize,char** ret,int top)
{
if(root)
{
if(root->childenNum==0)
{
int len=0;
char* tmp=(char*)malloc(sizeof(char)*10);
for(int i=0;i<top;i++)
len+=sprintf(tmp+len,"%c",sta[i]);
sprintf(tmp+len,"%c",root->data);
ret[(*returnSize)++]=tmp;
}
else
{
if(root!=_root)
sta[top++]=root->data;
for(int i=0;i<root->childenNum;i++)
{
Creat(root->childen[i],returnSize,ret,top);
}
}
}
}
思路可参参考
LeetCode-二叉树的所有路径
最终代码
typedef struct Tree{
char data;
int childenNum;
struct Tree *childen[4];
}
Tree,*Bitree;char sta[10];
Bitree _root;
char phoneMap[11][5] = {"\0", "\0", "abc\0", "def\0", "ghi\0", "jkl\0", "mno\0", "pqrs\0", "tuv\0", "wxyz\0"};
void Creat(Bitree root,int* returnSize,char** ret,int top)
{
if(root)
{
if(root->childenNum==0)
{
int len=0;
char* tmp=(char*)malloc(sizeof(char)*10);
for(int i=0;i<top;i++)
len+=sprintf(tmp+len,"%c",sta[i]);
sprintf(tmp+len,"%c",root->data);
ret[(*returnSize)++]=tmp;
}
else
{
if(root!=_root)//根没有值
sta[top++]=root->data;
for(int i=0;i<root->childenNum;i++)
{
Creat(root->childen[i],returnSize,ret,top);
}
}
}
}
void creatTree(Bitree* T,char*digits,int len)
{
if(len>0)
{
int t=strlen(phoneMap[digits[0]-'0']);
(*T)->childenNum=t;
for(int i=0;i<t;i++)
{
(*T)->childen[i]=(Bitree)malloc(sizeof(Tree));
(*T)->childen[i]->data=phoneMap[digits[0]-'0'][i];
(*T)->childen[i]->childenNum=0;
}
for(int i=0;i<t;i++)
{
creatTree(&(*T)->childen[i],digits+1,len-1);
}
}
}
char ** letterCombinations(char * digits, int* returnSize){
char**ret=(char**)malloc(sizeof(char*)*400);
*returnSize=0;
Bitree root=(Bitree)malloc(sizeof(Tree));
_root=root;
creatTree(&root,digits,strlen(digits));
Creat(root,returnSize,ret,0);
return ret;
}