Tcdian / keep

今天不想做,所以才去做。
MIT License
5 stars 1 forks source link

95. Unique Binary Search Trees II #264

Open Tcdian opened 3 years ago

Tcdian commented 3 years ago

95. Unique Binary Search Trees II

给定一个整数 n,生成所有由 1 ... n 为节点所组成的 二叉搜索树

Example

Input: 3
Output:
[
  [1,null,3,2],
  [3,2,null,1],
  [3,1,null,null,2],
  [2,1,3],
  [1,null,2,null,3]
]
Explanation:
The above output corresponds to the 5 unique BST's shown below:

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3
Tcdian commented 3 years ago

Solution

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {number} n
 * @return {TreeNode[]}
 */
var generateTrees = function(n) {
    if (n === 0) {
        return [];
    }
    return generateBST(1, n);

    function generateBST(leftBound, rightBound) {
        if (leftBound > rightBound) {
            return [null];
        }
        const nodeList = [];
        for(let i = leftBound; i <= rightBound; i++) {
            const leftNodeList = generateBST(leftBound, i - 1);
            const righNodeList = generateBST(i + 1, rightBound);
            for (let l = 0; l < leftNodeList.length; l++) {
                for (let r = 0; r < righNodeList.length; r++) {
                    const node = new TreeNode(i);
                    node.left = leftNodeList[l];
                    node.right = righNodeList[r];
                    nodeList.push(node);
                }
            }
        }
        return nodeList;
    }
};
/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */

function generateTrees(n: number): Array<TreeNode | null> {
    if (n === 0) {
        return [];
    }
    return generateBST(1, n);

    function generateBST(leftBound: number, rightBound: number): (TreeNode | null)[] {
        if (leftBound > rightBound) {
            return [null];
        }
        const nodeList: (TreeNode | null)[] = [];
        for(let i = leftBound; i <= rightBound; i++) {
            const leftNodeList = generateBST(leftBound, i - 1);
            const righNodeList = generateBST(i + 1, rightBound);
            for (let l = 0; l < leftNodeList.length; l++) {
                for (let r = 0; r < righNodeList.length; r++) {
                    const node = new TreeNode(i);
                    node.left = leftNodeList[l];
                    node.right = righNodeList[r];
                    nodeList.push(node);
                }
            }
        }
        return nodeList;
    }
};