給定一個整數 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
思路:枚舉每個root和對應的左右子樹情況,然后組合即可。
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/
class Solution {public LinkedList<TreeNode> generate_trees(int start, int end) {LinkedList<TreeNode> all_trees = new LinkedList<TreeNode>();if (start > end) {all_trees.add(null);return all_trees;}//枚舉所有rootfor (int i = start; i <= end; i++) {// 枚舉左子樹所有情況LinkedList<TreeNode> left_trees = generate_trees(start, i - 1);// 枚舉右子樹所有情況LinkedList<TreeNode> right_trees = generate_trees(i + 1, end);// 連接起來的所有情況for (TreeNode l : left_trees) {for (TreeNode r : right_trees) {TreeNode current_tree = new TreeNode(i);current_tree.left = l;current_tree.right = r;all_trees.add(current_tree);}}}return all_trees;}public List<TreeNode> generateTrees(int n) {if (n == 0) return new LinkedList<TreeNode>();return generate_trees(1, n);}
}
?