1. 程式人生 > >LeetCode-------unique-binary-search-trees-ii

LeetCode-------unique-binary-search-trees-ii

str post .com 們的 遞歸 [1] 大牛 tco left

題目:

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

題意:

這道題的大致意思就是給定n,對於1,2,3,4,....,n這n個數構建二叉搜索樹,共能構建幾個,而後將這n個數構成的二叉樹的根節點的值輸出。

前面我已經說過碰見二叉樹我們第一個想到的就是遞歸,下面我首先解釋一下這道題對n的取值,它的輸出,鑒於篇幅問題,n取值為1,2,3

當n為1的時候,很明顯輸出為[1],

當n為2的時候,我們來看共可以構建幾個二叉搜索樹:

1            2

                    \          /

                      2       1

當n=2時共可以構建兩顆二叉搜索樹,此時按照題目要求輸出為:[1,2].

當n=3時,按照題目舉例,輸出為[1,1,2,3,3]

以上就是這道題的大致題意,下面我將對大牛們關於這一題的解法進行詳細講解(沒辦法,水平沒有達到一定地步,這一題沒有解答出來)。

 1 /*
 2 下面我將就這段代碼進行詳細講解:
 3 假設此時n=3.
 4 
 5 (1)開始執行getTrees(1,3)函數,
 6 low = 1   high = 3
 7 在經過兩個if判斷之後,我們開始執行下面的for循環(通過對代碼的分析我們可以知道,在該函數開始執行時i就代表了我們的根節點),
8 9 執行第一次循環,i==1;left = getTrees(1,0) right = getTrees(2,3);在經過遞歸調用之後,left = [null], 10 11 開始遞歸調用getTrees函數求解right,分析可知,執行結束之後,right = [3,2], 12 13 返回i== 1時的情景,此時list= [1,1]. 14 同理可以得到i== 2時的情況以及i== 3時的情況, 15 16 另外我們註意當i== 1時,此時的二叉搜索樹為:1 1 17 \ 18 2 3 19 \ / 20 3 2 21 22 */ 23 24 25 26 27 28 29 import java.util.*; 30 public class Solution { 31 public ArrayList<TreeNode> generateTrees(int n) { 32 return getTrees(1,n); 33 } 34 public ArrayList<TreeNode> getTrees(int low,int high) 35 { 36 ArrayList<TreeNode> list = new ArrayList<TreeNode>(); 37 if(low > high) 38 { 39 list.add(null); 40 return list; 41 } 42 if(low == high) 43 { 44 TreeNode node = new TreeNode(low); 45 list.add(node); 46 return list; 47 } 48 49 for(int i = low;i<=high;i++) 50 { 51 ArrayList<TreeNode> left = getTrees(low,i-1); 52 ArrayList<TreeNode> right = getTrees(i+1,high); 53 54 for(int j = 0;j<left.size();j++) 55 { 56 for(int k = 0;k<right.size();k++) 57 { 58 TreeNode node = new TreeNode(i); 59 node.left = left.get(j); 60 node.right = right.get(k); 61 list.add(node); 62 } 63 } 64 } 65 return list; 66 } 67 }

上面的解釋比較枯燥,如果大家有什麽問題可以聯系我,我會詳細把流程發給您們,郵箱:[email protected] qq:764666877

LeetCode-------unique-binary-search-trees-ii