思路:二叉搜索树的特点很明显,如果有左边节点,那么左边节点都小于根节点,如果有右边节点,那么右边节点都大于根节点,我们可以循环遍历n中的每一个数i [1-n],以i作为跟,左子树为[1, i-1]所能构成的数,[i+1, right]为右边能构成的树,递归即可
/**
* 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) {
var getSubTree = (left, right) => {
let ans = [];
if(left > right) { return [null] }
else if (right === left) {
return [new TreeNode(left)];
} else {
for(let i = left; i <= right; i += 1) {
let leftArr = getSubTree(left, i-1);
let rightArr = getSubTree(i+1, right);
for(let leftNode of leftArr) {
for(let rightNode of rightArr) {
// 这里不重新定义根节点可能对后面有影响。
let root = new TreeNode(i);
root.left = leftNode;
root.right = rightNode;
ans.push(root);
}
}
}
return ans;
}
}
return getSubTree(1, n);
};