给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。
这道题是不同的二叉搜索树 I的进阶版本,I可以同过卡塔兰数直接抽象出答案,但是本题必须将构建的树具体保存。
var generateTrees = function(n) {
if(n==0) return [];//考虑为0的情况,防止返回[[]]
let arr=[];
for(let i=1;i<=n;i++){
arr.push(i);
}
function fun(array){
let ans=[];
if(!array.length){//当数组为空,只能用null赋值
ans.push(null);
return ans;
}
for(let i=0;i<array.length;i++){
let node=new TreeNode(array[i]);
let arr1=array.slice(0,i);//获取左数组
let arr2=array.slice(i+1);
let l=fun(arr1);//获取左数组产生的左子树集合
let r=fun(arr2);
for(let j=0;j<l.length;j++){
for(let k=0;k<r.length;k++){
let _node=JSON.parse(JSON.stringify(node));//深拷贝
_node.left=l[j];
_node.right=r[k];
ans.push(_node);//压入集合
}
}
}
return ans;
}
return fun(arr);
};