題目:
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.
For example,
Given n = 3, your program should return all 5 unique BST's shown below.
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
題解:
這道題比1難的就是不是返回個數,而是返回所有結果。
引用code ganker(http://codeganker.blogspot.com/2014/04/unique-binary-search-trees-ii-leetcode.html)的講解:
”這道題是求解所有可行的二叉查詢樹,從Unique Binary Search Trees中我們已經知道,可行的二叉查詢樹的數量是相應的卡特蘭數,不是一個多項式時間的數量級,所以我們要求解所有的樹,自然是不能多項式時間內完成的了。演算法上還是用求解NP問題的方法來求解,也就是N-Queens中 介紹的在迴圈中呼叫遞迴函式求解子問題。思路是每次一次選取一個結點為根,然後遞迴求解左右子樹的所有結果,最後根據左右子樹的返回的所有子樹,依次選取 然後接上(每個左邊的子樹跟所有右邊的子樹匹配,而每個右邊的子樹也要跟所有的左邊子樹匹配,總共有左右子樹數量的乘積種情況),構造好之後作為當前樹的 結果返回。 “
這道題的解題依據依然是:
當陣列為 1,2,3,4,.. i,.. n時,基於以下原則的BST建樹具有唯一性: 以i為根節點的樹,其左子樹由[1, i-1]構成, 其右子樹由[i+1, n]構成。
程式碼如下:
1 public ArrayList<TreeNode> generateTrees(int n) {
2 return generateTrees(1, n);//從1作為root開始,到n作為root結束
3 }
4
5 private ArrayList<TreeNode> generateTrees(int left, int right){
6 ArrayList<TreeNode> res = new ArrayList<TreeNode>();
7 if (left > right){
8 res.add(null);
9 return res;
10 }
11 for (int i = left; i <= right; i++){
12 ArrayList<TreeNode> lefts = generateTrees(left, i-1);//以i作為根節點,左子樹由[1,i-1]構成
13 ArrayList<TreeNode> rights = generateTrees(i+1, right);//右子樹由[i+1, n]構成
14 for (int j = 0; j < lefts.size(); j++){
15 for (int k = 0; k < rights.size(); k++){
16 TreeNode root = new TreeNode(i);
17 root.left = lefts.get(j);
18 root.right = rights.get(k);
19 res.add(root);//儲存所有可能行
20 }
21 }
22 }
23 return res;
24 }
2 return generateTrees(1, n);//從1作為root開始,到n作為root結束
3 }
4
5 private ArrayList<TreeNode> generateTrees(int left, int right){
6 ArrayList<TreeNode> res = new ArrayList<TreeNode>();
7 if (left > right){
8 res.add(null);
9 return res;
10 }
11 for (int i = left; i <= right; i++){
12 ArrayList<TreeNode> lefts = generateTrees(left, i-1);//以i作為根節點,左子樹由[1,i-1]構成
13 ArrayList<TreeNode> rights = generateTrees(i+1, right);//右子樹由[i+1, n]構成
14 for (int j = 0; j < lefts.size(); j++){
15 for (int k = 0; k < rights.size(); k++){
16 TreeNode root = new TreeNode(i);
17 root.left = lefts.get(j);
18 root.right = rights.get(k);
19 res.add(root);//儲存所有可能行
20 }
21 }
22 }
23 return res;
24 }