不同的二叉查詢樹 II lintcode
阿新 • • 發佈:2018-12-24
給出n,生成所有由1...n為節點組成的不同的二叉查詢樹
給出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]構成。