[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
- 96. 不同的二叉搜尋樹
- <動態規劃>Leetcode96.不同的二叉搜尋樹動態規劃LeetCode
- [Python手撕]不同的二叉搜尋樹Python
- Leetcode 700. 二叉搜尋樹中的搜尋(DAY 2)LeetCode
- (40/60)整數拆分、不同的二叉搜尋樹
- leetcode 700. 二叉搜尋樹中的搜尋 思考分析LeetCode
- 二叉搜尋樹
- Day 36 | 62.不同路徑 、 63. 不同路徑 II 、343. 整數拆分、96.不同的二叉搜尋樹
- LeetCode 熱題 HOT 100 Java題解——96. 不同的二叉搜尋樹LeetCodeJava
- 【LeetCode】98. 驗證二叉搜尋樹LeetCode
- LeetCode 95 | 構造出所有二叉搜尋樹LeetCode
- LeetCode-173-二叉搜尋樹迭代器LeetCode
- LeetCode98. 驗證二叉搜尋樹LeetCode
- 二叉搜尋樹的操作集
- 二叉搜尋樹的結構
- 【ALGO】Leetcode 98.驗證二叉搜尋樹GoLeetCode
- leetcode-1382. 將二叉搜尋樹變平衡LeetCode
- LeetCode-098-驗證二叉搜尋樹LeetCode
- dfs 驗證搜尋二叉樹——leetcode98二叉樹LeetCode
- Day20 | 654.最大二叉樹 、 617.合併二叉樹 、 700.二叉搜尋樹中的搜尋 98.驗證二叉搜尋樹二叉樹
- 程式碼隨想錄演算法訓練營第十七天|leetcode654. 最大二叉樹、leetcode617.合併二叉樹、leetcode700.二叉搜尋樹中的搜尋、leetcode98.驗證二叉搜尋樹演算法LeetCode二叉樹
- 二叉搜尋樹和二叉樹的最近公共祖先二叉樹
- LeetCode-099-恢復二叉搜尋樹LeetCode
- 資料結構中的樹(二叉樹、二叉搜尋樹、AVL樹)資料結構二叉樹
- 【LeetCode動態規劃#04】不同的二叉搜尋樹(找規律,有點像智力題)LeetCode動態規劃
- Leetcode 938. 二叉搜尋樹的範圍和(DAY 2)LeetCode
- leetcode 235. 二叉搜尋樹的最近公共祖先LeetCode
- javascript實現二叉搜尋樹JavaScript
- 有序表和搜尋二叉樹二叉樹
- js實現完全排序二叉樹、二叉搜尋樹JS排序二叉樹
- 二叉搜尋樹的python實現Python
- JavaScript 二叉搜尋樹以及實現翻轉二叉樹JavaScript二叉樹
- 演算法篇 - 二叉搜尋樹演算法
- 資料結構-二叉搜尋樹資料結構
- 【資料結構】二叉搜尋樹!!!資料結構
- 二叉搜尋樹程式碼例項