题意:

image.png

解题思路:

  1. 思路:
  2. 1. 我们从序列1..n中取出数字i,作为树的根节点。于是,剩余 i - 1 个元素可用于左子树,n - i 个元素用于右子树。
  3. 我们只需要把 1 作为根节点,[ ] 空作为左子树,[ 2 ... n ] 的所有可能作为右子树。
  4. 2 作为根节点,[ 1 ] 作为左子树,[ 3...n ] 的所有可能作为右子树。
  5. 3 作为根节点,[ 1 2 ] 的所有可能作为左子树,[] 作为右子树,然后左子树和右子树两两组合。
  6. n 作为根节点,[ 1... n ] 的所有可能作为左子树,[ ] 作为右子树。
  7. 2. 分别递归求出左右子树的所有方案;
  8. 3. 左子树的方案加上右子树的方案拼接在一起,构成当前节点的一种方案;
  9. 4. 将左右子树的所有方案两两组合,最后记录在res

PHP代码实现:

  1. class Solution {
  2. /**
  3. * @param Integer $n
  4. * @return TreeNode[]
  5. */
  6. function generateTrees($n) {
  7. if ($n == 0) return [];
  8. return $this->gen(1, $n);
  9. }
  10. function gen($start, $end) {
  11. $res = [];
  12. if ($start > $end) {
  13. array_push($res, null);
  14. }
  15. for ($i = $start; $i <= $end; $i++) {
  16. //左树全排列
  17. $left = $this->gen($start, $i - 1);
  18. //右树全排列
  19. $right = $this->gen($i + 1, $end);
  20. //所以全排列可能性
  21. foreach ($left as $l) {
  22. foreach ($right as $r) {
  23. $node = new TreeNode($i);
  24. $node->left = $l;
  25. $node->right = $r;
  26. array_push($res, $node);
  27. }
  28. }
  29. }
  30. return $res;
  31. }
  32. }

GO代码实现:

  1. /**
  2. * Definition for a binary tree node.
  3. * type TreeNode struct {
  4. * Val int
  5. * Left *TreeNode
  6. * Right *TreeNode
  7. * }
  8. */
  9. func generateTrees(n int) []*TreeNode {
  10. if n == 0 {
  11. return nil
  12. }
  13. return dfs(1, n)
  14. }
  15. func dfs(start, end int) []*TreeNode {
  16. var res []*TreeNode
  17. if start > end {
  18. res = append(res, nil)
  19. return res
  20. }
  21. for i := start; i <= end; i++ {
  22. for _, l := range dfs(start, i-1) {
  23. for _, r := range dfs(i+1, end) {
  24. cur := &TreeNode{
  25. Val: i,
  26. }
  27. cur.Left = l
  28. cur.Right = r
  29. res = append(res, cur)
  30. }
  31. }
  32. }
  33. return res
  34. }