95. 不同的二叉搜索树 II

心已赠人 2024-04-01 18:55 180阅读 0赞

95. 不同的二叉搜索树 II

给你一个整数 n, 请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。

示例 1:

在这里插入图片描述

输入:n = 3
输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]

  1. Input: 3
  2. Output:
  3. [
  4. [1,null,3,2],
  5. [3,2,null,1],
  6. [3,1,null,null,2],
  7. [2,1,3],
  8. [1,null,2,null,3]
  9. ]
  10. Explanation:
  11. The above output corresponds to the 5 unique BST's shown below:
  12. 1 3 3 2 1
  13. \ / / / \ \
  14. 3 2 1 1 3 2
  15. / / \ \
  16. 2 1 2 3
示例 2:

输入:n = 1
输出:[[1]]

提示:

1 < = n < = 8 1 <= n <= 8 1<=n<=8

思路:分治

对于二叉搜索树,任意一个根节点,其左孩子一定比根节点小;右孩子一定比根节点大,进而可以分解成每一个小部分:

  • 每个节点都可以做根节点
  • 确定完根节点,所有比根节点小的节点,一定在其左边
  • 所有比根节点大的结点,一定在其右边
然后我们来进行 分治算法三步走:
  • 分解:按运算符分成左右两部分,分别求解
  • 解决:实现一个递归函数,输入算式,返回算式解
  • 合并:根据运算符合并左右两部分的解,得出最终解

代码:(Java)

  1. import java.util.LinkedList;
  2. import java.util.List;
  3. import java.util.Queue;
  4. public class diff_bi_tree {
  5. public static class TreeNode {
  6. int val;
  7. TreeNode left;
  8. TreeNode right;
  9. TreeNode() {
  10. }
  11. TreeNode(int val) {
  12. this.val = val; }
  13. TreeNode(int val, TreeNode left, TreeNode right) {
  14. this.val = val;
  15. this.left = left;
  16. this.right = right;
  17. }
  18. }
  19. public static void main(String[] args) {
  20. // TODO 自动生成的方法存根
  21. int n = 3;
  22. List<TreeNode> tree = generateTrees(n);
  23. for(TreeNode t : tree) {
  24. Queue<TreeNode > que = new LinkedList<TreeNode>();
  25. que.add(t);
  26. int num = 0;
  27. while(!que.isEmpty()) {
  28. TreeNode l = que.poll();
  29. if(l != null && l.val != 0) {
  30. System.out.print(" "+l.val+" ");
  31. num++;
  32. if(num == n)
  33. break;
  34. }else {
  35. System.out.print(" null ");
  36. }
  37. if(l.left != null && l.val != 0) {
  38. que.add(l.left);
  39. }else if(l.val != 0){
  40. que.add(new TreeNode(0));
  41. }
  42. if(l.right != null && l.val != 0) {
  43. que.add(l.right);
  44. }else if(l.val != 0) {
  45. que.add(new TreeNode(0));
  46. }
  47. }
  48. System.out.println();
  49. }
  50. // System.out.println(tree);
  51. }
  52. public static List<TreeNode> generateTrees(int n) {
  53. if (n < 1) {
  54. return new LinkedList<TreeNode>();
  55. }
  56. return generateSubtrees(1, n);
  57. }
  58. private static List<TreeNode> generateSubtrees(int s, int e) {
  59. // TODO 自动生成的方法存根
  60. List<TreeNode> res = new LinkedList<TreeNode>();
  61. if(s > e) {
  62. res.add(null);
  63. return res;
  64. }
  65. for(int i=s; i<=e; i++) {
  66. List<TreeNode> leftSubtrees = generateSubtrees(s, i - 1);
  67. List<TreeNode> rightSubtrees = generateSubtrees(i + 1, e);
  68. for(TreeNode left : leftSubtrees) {
  69. for(TreeNode right : rightSubtrees) {
  70. TreeNode root = new TreeNode(i);
  71. root.left = left;
  72. root.right = right;
  73. res.add(root);
  74. }
  75. }
  76. }
  77. return res;
  78. }
  79. }
输出:

在这里插入图片描述

注:仅供学习参考

来源:力扣

发表评论

表情:
评论列表 (有 0 条评论,180人围观)

还没有评论,来说两句吧...

相关阅读