LeetCode-电话号码的字母组合(构造多叉树)

在这里插入图片描述
在这里插入图片描述

用示例一表示
在这里插入图片描述

  • 我们容易看出,我们只要将各数字对应的字母一一作为上一个数字的孩子,最后输出每一条路径,即为最终答案。
  1. 构造树的结构体
typedef struct Tree{
    char data;
    int childenNum;
    struct Tree* childen[4];//号码对应字母不超过4
}Tree,*Bitree;
  1. 构造多叉树
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往后移动一位
        }
    }
}

  1. 遍历多叉树,找出所有路径
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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值