题目

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

示例:

  1. 输入: 3
  2. 输出:
  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. 解释:
  11. 以上的输出对应以下 5 种不同结构的二叉搜索树:
  12. 1 3 3 2 1
  13. \ / / / \ \
  14. 3 2 1 1 3 2
  15. / / \ \
  16. 2 1 2 3

方案一

  1. /**
  2. * Definition for a binary tree node.
  3. * type TreeNode struct {
  4. * Val int
  5. * Left *TreeNode
  6. * Right *TreeNode
  7. * }
  8. */
  9. func generateTrees(n int) []*TreeNode {
  10. if n == 0 {
  11. return []*TreeNode{}
  12. }
  13. return helper(1, n)
  14. }
  15. func helper(start, end int) []*TreeNode {
  16. if start > end {
  17. return []*TreeNode{nil} // 这里必须返回 nil 数组
  18. }
  19. all_trees := []*TreeNode{}
  20. for i := start; i <= end; i++ {
  21. // 所有可能的左右子树
  22. left_trees := helper(start, i - 1)
  23. right_trees := helper(i + 1, end)
  24. for _, l := range left_trees {
  25. for _, r := range right_trees {
  26. all_trees = append(all_trees, &TreeNode{
  27. Val: i,
  28. Left: l,
  29. Right: r,
  30. })
  31. }
  32. }
  33. }
  34. return all_trees
  35. }

原文

https://leetcode-cn.com/explore/featured/card/recursion-i/260/conclusion/1233/
https://leetcode-cn.com/explore/featured/card/recursion-i/260/conclusion/1234/