95. Unique Binary Search Trees II
Leetcode
題目
Input: n = 3
Output: [[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]Input: n = 1
Output: [[1]]前置知識
解答
參考資料
Last updated
Input: n = 3
Output: [[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]Input: n = 1
Output: [[1]]Last updated
var generateTrees = function (n) {
const buildTrees = (start, end) => {
const trees = [];
// 沒有左邊大於右邊的子樹,所以 push null
if (start > end) {
trees.push(null);
return trees;
}
// 單一值的節點
if (start === end) {
const tree = new TreeNode(start);
trees.push(tree);
return trees;
}
// 從 start 開始將所有值當作根節點
for (let i = start; i <= end; i++) {
// 解釋1. 建構左子樹
const leftTrees = buildTrees(start, i - 1);
// 解釋2. 建構右子樹
const rightTrees = buildTrees(i + 1, end);
// 解釋3. 將左、右子樹兩兩配對
for (let leftTree of leftTrees) {
for (let rightTree of rightTrees) {
// 將左、右子樹配對的組合放在 root 底下
const root = new TreeNode(i);
root.left = leftTree;
root.right = rightTree;
trees.push(root);
}
}
}
return trees;
}
return buildTrees(1, n);
}; 3 3 3 3
/ \ / \ / \ / \
2 4 2 5 1 4 1 5
/ \ / / / \ / /
1 5 1 4 2 5 2 4