Skip to content

Instantly share code, notes, and snippets.

@alldroll
Created February 5, 2020 09:48
Show Gist options
  • Save alldroll/6aba32f51e30cfdaf541c08d237e410b to your computer and use it in GitHub Desktop.
Save alldroll/6aba32f51e30cfdaf541c08d237e410b to your computer and use it in GitHub Desktop.
// https://leetcode.com/problems/unique-binary-search-trees-ii
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func generateTrees(n int) []*TreeNode {
if n == 0 {
return []*TreeNode{}
}
trees := make([][][]*TreeNode, n + 2)
for i, _ := range trees {
trees[i] = make([][]*TreeNode, n + 2)
}
return generateTreesInRange(1, n, trees)
}
func generateTreesInRange(min, max int, memorized [][][]*TreeNode) []*TreeNode {
var trees []*TreeNode
for i := min; i <= max; i++ {
if memorized[min][i - 1] == nil {
memorized[min][i - 1] = generateTreesInRange(min, i - 1, memorized)
}
if memorized[i + 1][max] == nil {
memorized[i + 1][max] = generateTreesInRange(i + 1, max, memorized)
}
leftSubTrees := memorized[min][i - 1]
rightSubTrees := memorized[i + 1][max]
for _, left := range leftSubTrees {
for _, right := range rightSubTrees {
trees = append(trees, &TreeNode{
Val: i,
Left: left,
Right: right,
})
}
}
}
if len(trees) == 0 {
trees = append(trees, nil)
}
return trees
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment