95 Unique Binary Search Trees II

给定n,输出所有的二叉搜索树。

深度优先搜索:要生成1~n构成的所有BST,生成1~k-1的BST作为左子树,以及k+1~n的所有BST作为右子树,两两组合即可。当选择的根节点的值比left小的时候,左子树为空。

每次选取一个节点为根,递归求解左右子树的所有结果,根据左右子树返回所有子树,依次选取接上,每个左边的子树跟所有右边的子树匹配,每个右边子树也要跟所有左边的子树匹配,总共有左右子树数量的乘积种情况,构造结束之后作为当前树的结果返回。

faster than 96%

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {number} n
 * @return {TreeNode[]}
 */
var generateTrees = function(n) {
    var tree = []
    if(n === 0) return tree
    dfs(1, n, tree)
    return tree
};
var dfs = function(start, end, tree){
    if(start > end){
        tree.push(null)
        return
    }
    for(var i = start; i <= end; i++){
        var left = []
        var right = []
        dfs(start, i - 1, left)
        dfs(i + 1, end, right)
        for(var j = 0; j < left.length; j++){
            for(var k = 0; k < right.length; k++){
                var node = new TreeNode(i)
                node.left = left[j]
                node.right = right[k]
                tree.push(node)
            }
        } 
    }
}

你可能感兴趣的:(95 Unique Binary Search Trees II)