首页 > 其他分享 >多叉树应用 包括构建 dfs遍历

多叉树应用 包括构建 dfs遍历

时间:2023-09-16 16:55:28浏览次数:43  
标签:tmp digits 遍历 多叉树 tree dfs next push size

力扣17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:

输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
可视化
     a                b               c d   e   f       d   e   f       d   e   f

示例 2:

输入:digits = ""
输出:[]

示例 3:

输入:digits = "2"
输出:["a","b","c"]

代码:

/*
构建多叉树,每个结点有3或4个子节点。 以digits = “23” 为例
第一个数字为2  对于字母 a b c,于是构建3颗分别以a b c为头的树
之后遍历剩余数字,如3,将3对应字母 d e f分别插入每一颗树的 每一个叶子 结点后
   a                b               c
d   e   f       d   e   f       d   e   f
之后dfs每条颗树的每条路径,加入到ans
*/


struct tree{
    char c;
    vector<tree*>next;
    tree(char cc):c(cc){}
};
void insert(tree * t,string s){  //将一棵树的每个叶结点都插入s中的字母结点
    if(t == NULL) return;   //写不写都行,初始时t肯定不空,子递归的终止条件也不是这个。
    if(t->next.size() == 0){ //如果是叶子结点,将s的每一个字符插入子节点
        for(char c : s){
            tree * tmp = new tree(c);
            t->next.push_back(tmp);
        }
        return;
    }
    for(int i = 0; i < t->next.size(); i++){  //也是dfs遍历每一个叶子结点
        insert(t->next[i],s);
    }
}
void push(vector<string>&ans,string tmp,tree * t){ //dfs多叉树
    if(t->next.size() == 0){
        tmp+=t->c;
        ans.push_back(tmp);
        return;
    }
    tmp+=t->c;
    for(int i = 0; i < t->next.size(); i++){
//因为参数传值,不是引用,所以不需要专门处理回溯,如果传引用,要将tmp+=t->c写到push上一行,在push下一在去掉最后一个字母。
        push(ans,tmp,t->next[i]);
    }
}
class Solution {
public: 
    vector<string> letterCombinations(string digits) {
        if(digits.size() == 0) return {};
        vector<string> zimu{"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; //下标对应号码
        char one =digits[0];  //取第一个数字,构建对应字母为头的树 3颗或4颗
        vector<tree*> first(zimu[one-'0'].size(),NULL); //将根节点放在数组
        for(int i = 0; i < zimu[one-'0'].size(); i++){  //初始化每棵树的根结点字母
            first[i] = new tree(zimu[one-'0'][i]);
        }
        for(int i = 1; i < digits.size(); i++){  //处理剩余号码
            for(int j = 0; j < first.size(); j++){  //每棵树都insert 某号码对应的个字母
                insert(first[j],zimu[digits[i]-'0']);
            }
        }
        vector<string>ans;
        string tmp = "";
        for(int i = 0; i < first.size(); i++){
            push(ans,tmp,first[i]);  //every tree path
        }
        return ans;
    }
};

 





标签:tmp,digits,遍历,多叉树,tree,dfs,next,push,size
From: https://www.cnblogs.com/fyjie/p/17706933.html

相关文章

  • 二叉树的遍历
    总结深度优先与广度优先的区别1、区别1)二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列。2)深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次。要特别注意的是,二叉树的深度优先遍历比较特殊,可以......
  • Java数组遍历
    publicclassbianli{publicstaticvoidmain(String[]args){int[]arr={11,22,33,44,55};printArray(arr);}publicstaticvoidprintArray(int[]arr){System.out.print("[");......
  • HDFS体系结构
    HDFS体系结构HDFS支持主从结构,主节点称为NameNode,是因为主节点上运行的有NameNode进程,NameNode支持多个,目前我们的集群中只配置了一个从节点称为DataNode,是因为从节点上面运行的有DataNode进程,DataNode支持多个,目前我们的集群中有两个HDFS中还包含一个SecondaryNameNode进程,......
  • print()不带逗号、括号输出列表内容(不使用遍历)
    假设有一个列表li=[1,4,6,7,2,5]1、直接输出列表print(li)[1,4,6,7,2,5]2、增加*可以不带逗号、括号输出列表元素print(*li)1467253、还可以使用sep参数自定义每个元素之间的间隔符print(*li,sep='#')1#4#6#7#2#5 ......
  • 遍历输入框时出现输入一个字符立刻失焦,无法正常输入
    原因:循环时绑定输入框值为key,双向绑定时改变输入框值,key值被修改则失焦。解决:动态值不要作为key值 ......
  • c++ 实现 二叉树的 先序遍历,中序遍历 ,后序遍历
    遍历二叉树跟数组不同,树是一种非线性的数据结构,是由n(n>=0)个节点组成的有限集合。如果n==0,树为空树。如果n>0,树有一个特定的节点,叫做根节点(root)。 对于树这种数据结构,使用最频繁的是二叉树。每个节点最多只有2个子节点的树,叫做二叉树。二叉树中,每个节点的子节点作为根的两个子......
  • 【dfs基础题】洛谷P1219题解
    题目大意给定棋盘的规格为\(n×n\),现在要摆\(n\)个皇后,使得每个皇后不能互相攻击。题目解答由题意可知,如果两个皇后在同一行或同一列或同一对角线,那么就会互相攻击。那么就简单了,若当前要摆的是第\(i\)个皇后,那么只需要for循环一遍前面的\(i-1\)个皇后,判断前面的皇后......
  • HDFS的常见Shell操作
    HDFS的常见Shell操作直接在命令行中输入hdfsdfs,可以查看dfs后面可以跟的所有参数。详细使用方法请参考官方文档。注意:这里面的[]表示是可选项,<>表示是必填项[hadoop@hadoop81hadoop]$hdfsdfsUsage:hadoopfs[genericoptions] [-appendToFile<localsrc>...<dst>] [-cat......
  • 使用Python调用Hadoop Hdfs的API
    一、Java调用hdfs的apiimportorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.fs.FileSystem;importorg.apache.hadoop.fs.Path;importorg.junit.After;importorg.junit.Before;importorg.junit.Test;importjava.io.IOException;importjava.net......
  • RTMP视频服务器EasyDSS互联网视频直播点播平台如何基于FastDFS、ffmpeg、videojs实现
    互联网视频直播点播EasyDSS平台能实现视频流媒体的上传、转码、存储、录像、推流、拉流、直播等功能,在场景上,可以应用到互联网教育、在线课堂、游戏直播、视频点播、无人机等领域。 视频点播平台是指提供用户上传、存储和播放视频内容的在线平台。它可以让用户随时随地观看各......