二叉搜索树
不同的二叉搜索树【leetcode-95】
给你一个整数 n ,请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 **。可以按 任意顺序 返回答案。
解题思路
- 遍历数组范围,用每个元素作为根节点
- 使用递归,分别获取左子树和右子树,进行组合,然后加上根节点,返回
运行效率
代码如下
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> {
const arr = new Array(n).fill("").map((item, index) => index + 1);
return toSearchTree(0, arr.length - 1);
function toSearchTree(start: number, end: number): TreeNode[] {
if (start > end) {
return [];
}
if (start === end) {
return [new TreeNode(arr[start])];
}
let res: TreeNode[] = [];
for (let j = start; j <= end; j++) {
const leftNodes = toSearchTree(start, j - 1);
const rightNodes = toSearchTree(j + 1, end);
if (leftNodes.length && rightNodes.length) {
res = res.concat(
leftNodes.flatMap((litem) =>
rightNodes.map((ritem) => {
const root = new TreeNode(arr[j]);
root.left = litem;
root.right = ritem;
return root;
})
)
);
} else if (leftNodes.length) {
res = res.concat(
leftNodes.map((item) => {
const root = new TreeNode(arr[j]);
root.left = item;
return root;
})
);
} else if (rightNodes.length) {
res = res.concat(
rightNodes.map((item) => {
const root = new TreeNode(arr[j]);
root.right = item;
return root;
})
);
} else {
res.push(new TreeNode(arr[j]));
}
}
return res;
}
}
const res = generateTrees(3);
debugger;