95 不同的二叉搜索树 II
Solution
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func generateTrees(n int) []*TreeNode {
var arr []int
i :=1
for i <= n {
arr = append(arr,i)
i++
}
return builder(arr)
}
func builder(arr []int) []*TreeNode {
var nodes []*TreeNode
if len(arr)==0{
return []*TreeNode{nil}
}
// if len(arr)==1{
// nodes = append(nodes,&TreeNode{arr[0],nil,nil})
// return nodes
// }
i :=0
for ;i<len(arr);i++{
leftNodes :=builder(arr[:i])
rightNodes :=builder(arr[i+1:])
//if i == len(arr)-1 {
// rightNodes = []*TreeNode{nil}
// }
for _,v :=range leftNodes{
for _,vr :=range rightNodes{
node :=&TreeNode{arr[i],v,vr}
nodes = append(nodes,node)
}
}
}
return nodes
}
官方解答
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 _, left := range leftTrees {
for _, right := range rightTrees {
currTree := &TreeNode{i, nil, nil}
currTree.Left = left
currTree.Right = right
allTrees = append(allTrees, currTree)
}
}
}
return allTrees
}