|
@@ -9,11 +9,42 @@ package main
|
|
|
* }
|
|
|
*/
|
|
|
func generateTrees(n int) []*TreeNode {
|
|
|
- result := []*TreeNode{}
|
|
|
+ if n == 0 {
|
|
|
+ return []*TreeNode{}
|
|
|
+ }
|
|
|
+ G := make([][]*TreeNode, n+1)
|
|
|
+ G[0] = []*TreeNode{nil}
|
|
|
+ G[1] = []*TreeNode{&TreeNode{1, nil, nil}}
|
|
|
+ for i := 2; i <= n; i++ {
|
|
|
+ G[i] = make([]*TreeNode, 0)
|
|
|
+ for j := 1; j <= i; j++ {
|
|
|
+ // G(i) = sum F(j, i)
|
|
|
+ // F(j, i) = G(j-1) * G(i-j)
|
|
|
+ for k := 0; k < len(G[j-1]); k++ {
|
|
|
+ for l := 0; l < len(G[i-j]); l++ {
|
|
|
+ right := copyAndAddBiTree(G[i-j][l], j)
|
|
|
+ root := &TreeNode{j, G[j-1][k], right}
|
|
|
+ G[i] = append(G[i], root)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return G[n]
|
|
|
+}
|
|
|
|
|
|
- return result
|
|
|
+func copyAndAddBiTree(src *TreeNode, val int) *TreeNode {
|
|
|
+ if src == nil {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ dst := TreeNode{src.Val + val, nil, nil}
|
|
|
+ dst.Left = copyAndAddBiTree(src.Left, val)
|
|
|
+ dst.Right = copyAndAddBiTree(src.Right, val)
|
|
|
+ return &dst
|
|
|
}
|
|
|
|
|
|
// func main() {
|
|
|
-// fmt.Println(generateTrees(3))
|
|
|
+// for _, root := range generateTrees(3) {
|
|
|
+// printTree(root)
|
|
|
+// println()
|
|
|
+// }
|
|
|
// }
|