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]]

示例 2:

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

提示:

  • 1 <= n <= 8

代码参考:

package main

func main() {
    // fmt.Println(generateTrees(3))
}

func generateTrees(n int) []*TreeNode {
    if n == 0 {
        return nil
    }
    return generate(1, n)
}

func generate(start, end int) []*TreeNode {
    var roots []*TreeNode

    switch {
    case start > end: // 某一边子树无节点,左斜树或右斜树
        roots = append(roots, nil)

    case start == end: // 某一边子树只有一个节点
        roots = append(roots, &TreeNode{Val: start})

    case start < end:
        for rootV := start; rootV <= end; rootV++ { // 以 rootV 为根节点
            leftTrees := generate(start, rootV-1)
            rightTrees := generate(rootV+1, end)

            // 组合左右子树
            for _, ltree := range leftTrees {
                for _, rtree := range rightTrees {
                    root := &TreeNode{ // 以 rootV 为根节点的一棵 BST
                        Val:   rootV,
                        Left:  ltree,
                        Right: rtree,
                    }
                    roots = append(roots, root)
                }
            }
        }
    }

    return roots
}
最后编辑: kuteng  文档更新时间: 2021-06-05 10:16   作者:kuteng