给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同二叉搜索树。可以按 任意顺序 返回答案。
基本思路
类似 96. 不同的二叉搜索树,这题的思路也是类似的,想要构造出所有合法 BST,分以下三步:
1、穷举 root 节点的所有可能,而利用递归,可以枚举表示。
2、递归构造出左右子树的所有合法 BST。
3、给 root 节点穷举所有左右子树的组合。
递归要素
- 参数:start end,其中end是已知的节点个数;
- 返回值:树的结构体指针切片
- 终止条件:start > end
- 单层逻辑:一个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
}