package treeAndRecursion.code22;import java.util.ArrayList;import java.util.List;public class Solution { public List<String> result = new ArrayList<>(); /** * 整体思想就是深度优先遍历,产生出所有可能性组合的二叉树。然后剪枝剔除掉不合法的。 * @param n * @return */ public List<String> generateParenthesis(int n) { bfs("",n,n); return result; } /** * 深度优先遍历 * @param chosen 当前已经选择了的字符串 * @param left 当前左括号可用个数 * @param right 当前有括号可用个数 */ public void bfs(String chosen,int left,int right){ //递归结束条件。当左右括号都没有能用的了,就存储结果,并结束递归。 if(left == 0 && right == 0){ result.add(chosen); return; } //剪枝。当只有可用的右括号 > 可用的左括号,才是一个合法的组合。 // 因为如果左括号数比右括号多了,说明右边已经阔不回去了,就是不合法的了 if(left > right){ return; } //如果有可选的左括号。产生一个选择了左括号的左子树。 if(left > 0){ bfs(chosen + "(",left-1,right); } //如果有可选的左括号。产生一个选择了右括号的右子树。 if(right > 0){ bfs(chosen + ")", left, right-1); } }}