给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。
    示例 1:
    image.png
    输入:n = 3
    输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
    示例 2:

    输入:n = 1
    输出:[[1]]

    1. /**
    2. * Definition for a binary tree node.
    3. * function TreeNode(val, left, right) {
    4. * this.val = (val===undefined ? 0 : val)
    5. * this.left = (left===undefined ? null : left)
    6. * this.right = (right===undefined ? null : right)
    7. * }
    8. */
    9. /**
    10. * @param {number} n
    11. * @return {TreeNode[]}
    12. */
    13. var generateTrees = function (n) {
    14. if (n === 0) return [];
    15. const build = (lo, hi) => {
    16. let res = [];
    17. if (lo > hi) {
    18. res.push(null)
    19. return res;
    20. }
    21. // 1、穷举所有节点
    22. for (let i = lo; i <= hi; i += 1) {
    23. // 递归所有合法左右子树
    24. let leftTree = build(lo, i - 1);
    25. let rightTree = build(i + 1, hi);
    26. // 穷举组合
    27. for (let left of leftTree) {
    28. for (let right of rightTree) {
    29. // i 作为根节点 root 的值
    30. let root = new TreeNode(i);
    31. root.left = left;
    32. root.right = right;
    33. res.push(root);
    34. }
    35. }
    36. }
    37. return res;
    38. }
    39. return build(1, n)
    40. };

    image.png