Unique Binary Search Trees II --lintcode

Description

Given n, generate all structurally unique BST’s (binary search trees) that store values 1…n.

Example
Given n = 3, your program should return all 5 unique BST’s shown below.

這裏寫圖片描述

這道題比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. 選出根結點後應該先分別求解該根的左右子樹集合,也就是根的左子樹有若干種,它們組成左子樹集合,根的右子樹有若干種,它們組成右子樹集合。
2. 然後將左右子樹相互配對,每一個左子樹都與所有右子樹匹配,每一個右子樹都與所有的左子樹匹配。然後將兩個子樹插在根結點上。
3. 最後,把根結點放入鏈表中。

public ArrayList<TreeNode> generateTrees(int n) {
        return generateTrees(1, n);//從1作爲root開始,到n作爲root結束
    }

    private ArrayList<TreeNode> generateTrees(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> lefts = generateTrees(left, i-1);//以i作爲根節點,左子樹由[1,i-1]構成
            ArrayList<TreeNode> rights = generateTrees(i+1, right);//右子樹由[i+1, n]構成
            for (int j = 0; j < lefts.size(); j++){
                for (int k = 0; k < rights.size(); k++){
                    TreeNode root = new TreeNode(i);
                    root.left = lefts.get(j);
                    root.right = rights.get(k);
                    res.add(root);//存儲所有可能行
                }
            }
        }
        return res;
    }

轉載網址:http://www.cnblogs.com/springfor/p/3884029.html

發佈了53 篇原創文章 · 獲贊 5 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章