问题:给定一个正整n,作为括号的对数,输出所有括号可能的组合,如 n=2 (()) ()() n = 3的情况 ((())) (()()) (())() ()(()) ()()()
在之前的一篇文章中,我们采用了深度优先搜索的方式实现:(深度优先搜索)打印所有可能的括号组合
本博文中,我们将给出采用广度优先搜索的方式实现,程序如下:
public class ParenthesesGenerator { public void generateParentheses(int parenthesesCount) { bfs("", parenthesesCount, parenthesesCount); } /** * 采用深度搜索优先的方式 BFS(breadth-first search) * * @param currentParentheses * @param remanentLeftParenthesesRemain * @param remanentRightParenthesesRemain */ private void bfs(String currentParentheses, int remanentLeftParenthesesRemain, int remanentRightParenthesesRemain) { /** * 如果左括号数和右括号数都为0的时候,表示已经找到一种解决方式, 直接输出结果 */ if (remanentLeftParenthesesRemain == 0 && remanentRightParenthesesRemain == 0) { System.out.println(currentParentheses); } /** * 如果右括号剩余数大于左括号剩余数,则添加一个右括号,右括号剩余数减去1,然后递归调用自身 */ if (remanentRightParenthesesRemain > remanentLeftParenthesesRemain) { bfs(currentParentheses + ")", remanentLeftParenthesesRemain, remanentRightParenthesesRemain - 1); } /** * 如果左括号数还有剩余,则将当前括号组成字符添加一个左括号, 然后递归调用本身 */ if (remanentLeftParenthesesRemain > 0) { bfs(currentParentheses + "(", remanentLeftParenthesesRemain - 1, remanentRightParenthesesRemain); } } }
测试程序及其结果如下
public class ParenthesesGeneratorTest { public static void main(String[] args) { ParenthesesGenerator test = new ParenthesesGenerator(); for (int i = 1; i < 5; i++) { System.out.printf("有%d括号的所有组合:\n", i); test.generateParentheses(i); } } }
有1括号的所有组合: () 有2括号的所有组合: ()() (()) 有3括号的所有组合: ()()() ()(()) (())() (()()) ((())) 有4括号的所有组合: ()()()() ()()(()) ()(())() ()(()()) ()((())) (())()() (())(()) (()())() (()()()) (()(())) ((()))() ((())())
原文地址 http://thecodesample.com/?p=954
更多代码实例请访问 http://thecodesample.com/
相关推荐
深度优先搜索(Depth-First Search, DFS)与广度优先搜索(Breadth-First Search, BFS)是图论和算法领域中两种重要的遍历策略,常用于解决各种问题,如搜索路径、判断连通性、拓扑排序等。在面试中,熟练掌握这两种...
2. 按层打印所有原子:采用广度优先搜索(BFS)的方式,逐层打印广义表中的原子元素,先打印最外层,再依次打印内层。 四、广义表的应用场景 1. 表达树形结构:广义表可以方便地表示各种树形结构,如二叉树、多叉树...
在算法设计上,我们可以采用深度优先搜索或广度优先搜索策略,遍历所有可能的运算组合。对于每一种组合,我们可以利用栈来辅助存储中间运算结果。例如,当遇到乘法或除法运算时,需要将当前的两个数压入栈中,然后...
- **广度优先搜索(BFS)**:在图或树的遍历中,队列用于广度优先搜索。首先将根节点加入队列,然后每次从队头取出一个节点,访问其所有邻居,并将它们加入队列。 5. **银行排队系统**:模拟银行客户等待服务的...
4. **递归搜索**:为了找到所有可能的运算组合,程序通常采用深度优先搜索(DFS)或广度优先搜索(BFS)策略。每一步都是对当前的四个数进行一次运算,然后递归地处理剩下的三个数,直到所有可能的组合都被尝试过。 ...
同时,队列也是实现广度优先搜索(BFS)的基础数据结构。 在第三章的习题中,可能涉及以下知识点: 1. 栈的基本操作与实现:理解栈的基本操作,如初始化、压栈、弹栈、判空和查找栈顶元素。栈可以通过数组或链表来...
6. **算法设计**:求解表达式可能涉及不同的算法,如深度优先搜索(DFS)或广度优先搜索(BFS)来处理括号嵌套,或者使用栈数据结构来计算后缀表达式。对于简单算术运算,可以使用递归或迭代方法。 7. **代码组织**...
队列用于广度优先搜索(BFS)、打印多层队列等。考生需要熟练掌握这两种抽象数据类型的定义、操作和应用。 3. **树结构**:二叉树是基础,包括二叉搜索树、完全二叉树、满二叉树等。平衡树如AVL树和红黑树提高了...
广度优先搜索 问题 描述 锯齿形打印二叉树 周边区域(DFS 或 BFS) 二叉树右侧视图 课程安排 K 站内最便宜的航班 字梯II 删除无效括号 打印二叉树 最小高度树 01矩阵 字梯 两岛最短桥(DFS 和 BFS) 困水 II 硬 网络...
- **队列**:虽然在这个场景下队列不是必需的,但在某些算法中,如广度优先搜索(BFS),队列可以帮助管理运算符或表达式中的元素。 3. **运算符优先级**: 加法和乘法具有相同的优先级,高于减法和除法。运算符...
图算法,如深度优先搜索(DFS)和广度优先搜索(BFS),在解决许多实际问题中至关重要。 此外,哈希表是一种提供快速查找、插入和删除操作的数据结构,它通过哈希函数将键映射到表中的特定位置。散列表的平均时间...
计算森林中所有树的叶子节点数量,我们需要遍历每棵树,对每棵树的根节点进行深度优先搜索(DFS)或广度优先搜索(BFS),并在遍历过程中记录叶子节点。这个过程涉及递归和迭代两种编程技巧。 **第2关:树转化为...
【数据结构】中的栈(Stack)与队列(Queue) ...4. **广度优先搜索(BFS)**:在图和树的遍历中,队列用于进行广度优先遍历。 理解栈和队列是掌握数据结构基础的关键,它们在编程和算法设计中扮演着重要角色。
图的常见算法有深度优先搜索(DFS)和广度优先搜索(BFS),还有最短路径算法(如Dijkstra算法和Floyd算法)。 6. **排序算法**:排序算法是编程中不可或缺的一部分,包括冒泡排序、插入排序、选择排序、快速排序、...
队列在操作系统中用于任务调度、打印任务管理、网络数据包处理等,同时在广度优先搜索(BFS)算法中也起到关键作用。 在PPT课件“数据结构03.ppt”中,可能包含以下内容: 1. 栈的基本概念:定义、特性以及实例...
图结构则广泛应用于网络路由、社交网络分析等领域,图的遍历算法(深度优先搜索和广度优先搜索)和最短路径算法(如Dijkstra算法和Floyd-Warshall算法)是关键知识点。 此外,散列表(哈希表)是另一种高效的数据...
例如,函数调用可能由一个表示函数名的节点、一个表示括号的节点和若干个表示参数的节点组成。 **2. AST的创建** 创建AST的过程称为词法分析和语法分析。词法分析(Lexical Analysis)将源代码分解成一个个符号...
9. 广度优先搜索 9.1 单词变换路径(Word Ladder) 9.1.1 是否存在变换路径 9.1.2 所有最短变换路径9.2 包围区域 10. 深度优先搜索 10.1 N皇后问题 10.2 恢复IP地址 10.3 集合元素之和 10.3.1 元素可以重复 10.3.2 ...
- **深度优先搜索**和**广度优先搜索**:遍历图的所有节点,解决连通性问题。 7. **数据结构**: - **栈**:后进先出(LIFO),常用于表达式求解、括号匹配等。 - **队列**:先进先出(FIFO),常用于任务调度、...