给定一个整数 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 }