Unique Binary Search Trees II leetcode java


題目

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     }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM