95. 不同的二叉搜索树 II

136 阅读1分钟

给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同二叉搜索树。可以按 任意顺序 返回答案。

基本思路

类似 96. 不同的二叉搜索树,这题的思路也是类似的,想要构造出所有合法 BST,分以下三步:

1、穷举 root 节点的所有可能,而利用递归,可以枚举表示。

2、递归构造出左右子树的所有合法 BST。

3、给 root 节点穷举所有左右子树的组合。

递归要素

  1. 参数:start end,其中end是已知的节点个数;
  2. 返回值:树的结构体指针切片
  3. 终止条件:start > end
  4. 单层逻辑:一个for循环从start到end,获得所有可行的节点集合
func generateTrees(n int) []*TreeNode {
    if n == 0 {
        return nil
    }
    return helper(1, n)
}

func helper(start, end int) []*TreeNode { //获得所有可行的节点集合

    //终止条件
    if start > end {
        return []*TreeNode{nil}
    }
	
    allTrees := []*TreeNode{} //树的结构体指针类型切片
	
    // 枚举可行根节点
    for i := start; i <= end; i++ {
        // 获得所有可行的左子树集合
        leftTrees := helper(start, i - 1)
        // 获得所有可行的右子树集合
        rightTrees := helper(i + 1, end)
        
        // 从左子树集合中选出一棵左子树,从右子树集合中选出一棵右子树,拼接到根节点上
	// for-range左侧的两个位置对应着key-value,
        for _, left := range leftTrees {//用两个for循环穷举左右组合的可能性 
            for _, right := range rightTrees {
                currTree := &TreeNode{i, nil, nil} 
                //在Go语言中,对结构体进行&取地址操作时,视为对该类型进行一次 new 的实例化操作,取地址格式如下: ins := &T{}
                currTree.Left = left
                currTree.Right = right
                allTrees = append(allTrees, currTree)
            }
        }
    }
    return allTrees
}