1. 程式人生 > >不同的二叉查詢樹 II lintcode

不同的二叉查詢樹 II lintcode

給出n,生成所有由1...n為節點組成的不同的二叉查詢樹

您在真實的面試中是否遇到過這個題?  Yes 樣例

給出n = 3,生成所有5種不同形態的二叉查詢樹:

1         3     3       2    1
 \       /     /       / \    \
  3     2     1       1   3    2
 /     /       \                \
2     1         2                3
public class 不同的二叉查詢樹2 {
    /**
     * @paramn n: An integer
     * @return: A list of root
     */
    public List<TreeNode> generateTrees(int n) {
        // write your code here
    	
    	if(n < 0)return null;
    	return createTree(1, n);
    }
    public List<TreeNode> createTree(int start, int end){
    	List<TreeNode> res = new ArrayList<TreeNode>();
    	if(start > end){
    		res.add(null);
    		return res;
    	}
    	for(int i = start; i <=end; i++){
    		List<TreeNode> left = createTree(start, i-1);
    		List<TreeNode> right = createTree(i+1, end);
    		for(int j = 0; j < left.size(); j++){
    			for(int k = 0 ; k < right.size(); k++){
    				TreeNode root = new TreeNode(i);
    				root.left = left.get(j);
    				root.right = right.get(k);
    				res.add(root);
    			}
    		}
    	}    	
    	return res;
    }
    public static void main(String[] args){
    	不同的二叉查詢樹2 tree = new 不同的二叉查詢樹2();
    	List<TreeNode> res = tree.generateTrees(3);
    	for(TreeNode tre:res){
    		tre.pre(tre);
    		System.out.println();
    	}
    }
}

public class TreeNode {
	public int val;
	public TreeNode left, right;

	public TreeNode(int val) {
		this.val = val;
		this.left = this.right = null;
	}
	public void pre(TreeNode root){
		System.out.print(root.val+" ");
		if(root.left != null)pre(root.left);
		if(root.right != null)pre(root.right);
	}
}

這道題比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]構成。