95.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package main
  2. /**
  3. * Definition for a binary tree node.
  4. * type TreeNode struct {
  5. * Val int
  6. * Left *TreeNode
  7. * Right *TreeNode
  8. * }
  9. */
  10. func generateTrees(n int) []*TreeNode {
  11. if n == 0 {
  12. return []*TreeNode{}
  13. }
  14. G := make([][]*TreeNode, n+1)
  15. G[0] = []*TreeNode{nil}
  16. G[1] = []*TreeNode{&TreeNode{1, nil, nil}}
  17. for i := 2; i <= n; i++ {
  18. G[i] = make([]*TreeNode, 0)
  19. for j := 1; j <= i; j++ {
  20. // G(i) = sum F(j, i)
  21. // F(j, i) = G(j-1) * G(i-j)
  22. for k := 0; k < len(G[j-1]); k++ {
  23. for l := 0; l < len(G[i-j]); l++ {
  24. right := copyAndAddBiTree(G[i-j][l], j)
  25. root := &TreeNode{j, G[j-1][k], right}
  26. G[i] = append(G[i], root)
  27. }
  28. }
  29. }
  30. }
  31. return G[n]
  32. }
  33. func copyAndAddBiTree(src *TreeNode, val int) *TreeNode {
  34. if src == nil {
  35. return nil
  36. }
  37. dst := TreeNode{src.Val + val, nil, nil}
  38. dst.Left = copyAndAddBiTree(src.Left, val)
  39. dst.Right = copyAndAddBiTree(src.Right, val)
  40. return &dst
  41. }
  42. // func main() {
  43. // for _, root := range generateTrees(3) {
  44. // printTree(root)
  45. // println()
  46. // }
  47. // }