1. 程式人生 > >Unique Binary Search Trees II -- LeetCode

Unique Binary Search Trees II -- LeetCode

tco 代碼 遞歸函數 _id n-queen sea ftl add trac

原題鏈接: http://oj.leetcode.com/problems/unique-binary-search-trees-ii/
這道題是求解全部可行的二叉查找樹,從Unique Binary Search Trees中我們已經知道,可行的二叉查找樹的數量是對應的卡特蘭數,不是一個多項式時間的數量級,所以我們要求解全部的樹,自然是不能多項式時間內完畢的了。算法上還是用求解NP問題的方法來求解,也就是N-Queens中介紹的在循環中調用遞歸函數求解子問題。思路是每次一次選取一個結點為根,然後遞歸求解左右子樹的全部結果。最後依據左右子樹的返回的全部子樹。依次選取然後接上(每一個左邊的子樹跟全部右邊的子樹匹配,而每一個右邊的子樹也要跟全部的左邊子樹匹配,總共同擁有左右子樹數量的乘積種情況),構造好之後作為當前樹的結果返回。

代碼例如以下:

public ArrayList<TreeNode> generateTrees(int n) {
    return helper(1,n);
}
private ArrayList<TreeNode> helper(int left, int right)
{
    ArrayList<TreeNode> res = new ArrayList<TreeNode>();
    if(left>right)
    {
        res.add(null);
        return res;
    }
    for(int i=left;i<=right;i++)
    {
        ArrayList<TreeNode> leftList = helper(left,i-1);
        ArrayList<TreeNode> rightList = helper(i+1,right);
        for(int j=0;j<leftList.size();j++)
        {
            for(int k=0;k<rightList.size();k++)
            {
                TreeNode root = new TreeNode(i);
                root.left = leftList.get(j);
                root.right = rightList.get(k);
                res.add(root);
            }
        }
    }
    return res;
}
實現中還是有一些細節的,由於構造樹時兩邊要遍歷全部左右的匹配。然後接到根上面。


當然我們也能夠像在Unique Binary Search Trees中那樣存儲全部的子樹歷史信息,然後進行拼合,盡管能夠省一些時間,可是終於還是逃只是每一個結果要一次運算。時間復雜度還是非多項式的,而且要耗費大量的空間。感覺這種意義就不是非常大了。

Unique Binary Search Trees II -- LeetCode