1. package treeAndRecursion.code22;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. public class Solution {
    5. public List<String> result = new ArrayList<>();
    6. /**
    7. * 整体思想就是深度优先遍历,产生出所有可能性组合的二叉树。然后剪枝剔除掉不合法的。
    8. * @param n
    9. * @return
    10. */
    11. public List<String> generateParenthesis(int n) {
    12. bfs("",n,n);
    13. return result;
    14. }
    15. /**
    16. * 深度优先遍历
    17. * @param chosen 当前已经选择了的字符串
    18. * @param left 当前左括号可用个数
    19. * @param right 当前有括号可用个数
    20. */
    21. public void bfs(String chosen,int left,int right){
    22. //递归结束条件。当左右括号都没有能用的了,就存储结果,并结束递归。
    23. if(left == 0 && right == 0){
    24. result.add(chosen);
    25. return;
    26. }
    27. //剪枝。当只有可用的右括号 > 可用的左括号,才是一个合法的组合。
    28. // 因为如果左括号数比右括号多了,说明右边已经阔不回去了,就是不合法的了
    29. if(left > right){
    30. return;
    31. }
    32. //如果有可选的左括号。产生一个选择了左括号的左子树。
    33. if(left > 0){
    34. bfs(chosen + "(",left-1,right);
    35. }
    36. //如果有可选的左括号。产生一个选择了右括号的右子树。
    37. if(right > 0){
    38. bfs(chosen + ")", left, right-1);
    39. }
    40. }
    41. }