• 95. 不同的二叉搜索树 II


    给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树。

    示例:

    输入: 3
    输出:
    [
      [1,null,3,2],
      [3,2,null,1],
      [3,1,null,null,2],
      [2,1,3],
      [1,null,2,null,3]
    ]
    解释:
    以上的输出对应以下 5 种不同结构的二叉搜索树:

    1 3 3 2 1
    / / /
    3 2 1 1 3 2
    / /
    2 1 2 3

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/unique-binary-search-trees-ii
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    这种方法只能保存树的结构,并不能按照题目要求的顺序输出。比较坑。。。

     1 private TreeNode saveStructure(TreeNode root){
     2         if (root != null) {
     3             TreeNode p = new TreeNode(root.val);
     4             p.left = saveStructure(root.left);
     5             p.right = saveStructure(root.right);
     6             return p;
     7         }
     8         return null;
     9     }
    10     /**
    11      *
    12      * @param n:未添加节点个数
    13      * @param p:父节点
    14      * @param res:结果集
    15      */
    16     private void helper(int n,TreeNode p,TreeNode root, List<TreeNode> res){
    17         if (n == 0) {
    18             // 保存树的结构
    19                 TreeNode copyRoot = saveStructure(root);
    20                 res.add(copyRoot);
    21             return;
    22         }
    23         // 构建右孩子
    24         p.left = null;
    25         TreeNode right = new TreeNode(n);
    26         p.right = right;
    27         helper(n-1, right, root, res);
    28         p.left = p.right = null;
    29 
    30         // 构建左孩子
    31         TreeNode left = new TreeNode(n);
    32         p.left = left;
    33         helper(n-1, left, root, res);
    34         p.left = p.right = null;
    35 
    36         // 构建左右孩子
    37         if (n-2 < 0)
    38             return ;
    39         TreeNode left1 = new TreeNode(n);
    40         TreeNode right2 = new TreeNode(n - 1);
    41         p.left = left1;
    42         p.right = right2;
    43         helper(n-2, left1, root, res);
    44         if (n-2 != 0) // 防止保存两次结果
    45             helper(n-2, right2, root, res);
    46     }
    47 
    48     public List<TreeNode> generateTrees(int n) {
    49         List<TreeNode> res = new ArrayList<>();
    50         TreeNode root = new TreeNode(n);
    51         helper(n-1, root, root, res);
    52         return res;
    53     }
    54 
    55     private static void preOrder(TreeNode p) {
    56         if (p != null) {
    57             System.out.print(p.val+", ");
    58             preOrder(p.left);
    59             preOrder(p.right);
    60         } else {
    61             System.out.print("null, ");
    62         }
    63     }
  • 相关阅读:
    Vue学习-Day1
    Shell脚本学习
    Linux基础
    C# int.Parse()、int.TryParse()与Convert.ToInt32()的区别
    windows下跑python flask,环境配置
    linq性能剖析
    servicestack操作redis
    程序员福利各大平台免费接口非常适用
    ASP.NET下跨应用共享Session和使用Redis进行Session托管简介
    Web Farm和Web Garden的区别
  • 原文地址:https://www.cnblogs.com/yfs123456/p/11604705.html
Copyright © 2020-2023  润新知