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     }

 

posted @ 2019-09-28 20:25  赤云封天  阅读(126)  评论(0编辑  收藏  举报