# [95] 不同的二叉搜索树 II
给定一个整数 n,生成所有由 1 ... n 为节点所组成的二叉搜索树。
示例:
输入: 3
输出:
[
[1,null,3,2],
[3,2,null,1],
[3,1,null,null,2],
[2,1,3],
[1,null,2,null,3]
]
这道题请与96. 不同的二叉搜索树
配合食用,这道题需要求对按数字顺序1~n组成的树进行先序遍历,求所有可能的组成。
因为我们知道先序遍历的二叉查找树,父节点一定会大于左子节点,小于右子节点,因此我们可以使用递归来解这个问题(暂时还没有想出使用动态规划的话用什么存入dp数组里,但思想上还是使用dp的思想减少解重复子问题次数)
首先选取当前根节点为x,则左子树节点数为(l ~ x-1),右子树节点数为(x+1, r),之后进行递归遍历即可。
var generateTrees = function(n) {
if (n === 0) return [];
const res = helper(1, n);
return res;
};
function TreeNode(val) {
this.val = val;
this.left = this.right = null;
}
function helper(l, r) {
if (l > r) return [null];
if (l === r) return [new TreeNode(l)];
const subTree = [];
for (let i = l; i <= r; i++) {
const leftSubTree = helper(l, i - 1);
const rightSubTree = helper(i + 1, r);
for (let leftNode of leftSubTree) {
for (let rightNode of rightSubTree) {
const rootNode = new TreeNode(i);
rootNode.left = leftNode;
rootNode.right = rightNode;
subTree.push(rootNode);
}
}
}
return subTree;
}