今天做了道题目,《手机键盘输入》当按下23时,输出["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]。
其实说白了,也就是全排列问题,将2代表的abc,和3代表的def输出组合的字符。
我是按照普通方法,递归来写的,觉得这道题目也只是考验编程,考验递归的。没太多考虑,当上网看别人都提到DFS(深度优先算法)后,才意识到,是有章法可循的。以前只以为深度优先和广度优先只是在图的遍历的时候才能用到,想不到这些也只是工具,看你怎么去应用到你的算法里面。
好了,不多说了,基于上述原因,参考《数据结构》和《算法导论》将广度优先和深度优先总结一下。
这两个算法的共同点,都是要有标记!数据结构采用的是一个数组来标记每一个结点是否被遍历;算法导论是在结点中附设一个颜色值,来表示遍历的程度。其实质是一样的,都需要借助于标记,来实现。但在二叉树的遍历中就不需要了,因为不会形成回路。
一:深度优先算法
方案一:“数据结构”
其实这是树的先根遍历的扩展。
通过图(b)我们可以看到,v1-v4-v8-v5-v3-v6-v7。
只要遍历到某一个结点,有子节点就先遍历子节点ÿ