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);
}
}
}