Unique Binary Search Trees II leetcode java

愛做飯的小瑩子發表於2014-08-01

題目

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     }

相關文章