[leetCode]95. 不同的二叉搜尋樹 II
題目
連結:https://leetcode-cn.com/problems/unique-binary-search-trees-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]
]
解釋:
以上的輸出對應以下 5 種不同結構的二叉搜尋樹:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
分治
思路:
由於是二叉搜尋樹所以它的特點是中間節點大於左子樹所有節點,小於右子樹所有節點。
一個[1~n]
的序列可以看作二叉搜尋樹的中序遍歷,序列中的數字i
可以作為中間節點,而[1~i-1]
為左子樹的節點,[i+1~n]
為右子樹的節點,因此可以通過遞迴得到左子樹的集合與右子樹的集合,然後通過遍歷兩個集合將左子樹與右子樹相互組合即可得到所有二叉搜尋樹。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<TreeNode> generateTrees(int n) {
if (n == 0) return new LinkedList<>();
return generateSubTrees(1, n);
}
private List<TreeNode> generateSubTrees(int start, int end) {
List<TreeNode> allTrees = new LinkedList<>();
if (start > end) {
allTrees.add(null);
return allTrees;
}
for (int i = start; i <= end; i++) {
List<TreeNode> leftTrees = generateSubTrees(start, i - 1);
List<TreeNode> rightTrees = generateSubTrees(i+1, end);
for (TreeNode l : leftTrees) {
for (TreeNode r : rightTrees) {
TreeNode cur = new TreeNode(i);
cur.left = l;
cur.right = r;
allTrees.add(cur);
}
}
}
return allTrees;
}
}
相關文章
- LeetCode-095-不同的二叉搜尋樹 IILeetCode
- LeetCode-096-不同的二叉搜尋樹LeetCode
- <動態規劃>Leetcode96.不同的二叉搜尋樹動態規劃LeetCode
- 96. 不同的二叉搜尋樹
- [Python手撕]不同的二叉搜尋樹Python
- Leetcode 700. 二叉搜尋樹中的搜尋(DAY 2)LeetCode
- leetcode 700. 二叉搜尋樹中的搜尋 思考分析LeetCode
- LeetCode 熱題 HOT 100 Java題解——96. 不同的二叉搜尋樹LeetCodeJava
- LeetCode 95 | 構造出所有二叉搜尋樹LeetCode
- LeetCode98. 驗證二叉搜尋樹LeetCode
- LeetCode-098-驗證二叉搜尋樹LeetCode
- LeetCode-099-恢復二叉搜尋樹LeetCode
- 【LeetCode】98. 驗證二叉搜尋樹LeetCode
- LeetCode-173-二叉搜尋樹迭代器LeetCode
- (40/60)整數拆分、不同的二叉搜尋樹
- leetcode 235. 二叉搜尋樹的最近公共祖先LeetCode
- 程式碼隨想錄演算法訓練營第十七天|leetcode654. 最大二叉樹、leetcode617.合併二叉樹、leetcode700.二叉搜尋樹中的搜尋、leetcode98.驗證二叉搜尋樹演算法LeetCode二叉樹
- leetcode-1382. 將二叉搜尋樹變平衡LeetCode
- 【ALGO】Leetcode 98.驗證二叉搜尋樹GoLeetCode
- dfs 驗證搜尋二叉樹——leetcode98二叉樹LeetCode
- Day 36 | 62.不同路徑 、 63. 不同路徑 II 、343. 整數拆分、96.不同的二叉搜尋樹
- 二叉搜尋樹
- (117)235. 二叉搜尋樹的最近公共祖先(leetcode)LeetCode
- 【LeetCode動態規劃#04】不同的二叉搜尋樹(找規律,有點像智力題)LeetCode動態規劃
- LeetCode-230-二叉搜尋樹中第K小的元素LeetCode
- Leetcode230. 二叉搜尋樹中第K小的元素LeetCode
- Leetcode 938. 二叉搜尋樹的範圍和(DAY 2)LeetCode
- 96不同的二查搜尋樹
- 二叉搜尋樹的操作集
- 二叉搜尋樹的結構
- LeetCode 109——有序連結串列轉化二叉搜尋樹LeetCode
- Day20 | 654.最大二叉樹 、 617.合併二叉樹 、 700.二叉搜尋樹中的搜尋 98.驗證二叉搜尋樹二叉樹
- 二叉搜尋樹和二叉樹的最近公共祖先二叉樹
- 從二分搜尋到二叉搜尋樹
- LeetCode系列之「有序連結串列轉換二叉搜尋樹」LeetCode
- LeetCode-109-有序連結串列轉換二叉搜尋樹LeetCode
- LeetCode將有序陣列轉化為二叉搜尋樹--JavaLeetCode陣列Java
- 二叉搜尋樹的python實現Python