Unique Binary Search Trees II -- LeetCode
阿新 • • 發佈:2017-06-08
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中介紹的在循環中調用遞歸函數求解子問題。思路是每次一次選取一個結點為根,然後遞歸求解左右子樹的全部結果。最後依據左右子樹的返回的全部子樹。依次選取然後接上(每一個左邊的子樹跟全部右邊的子樹匹配,而每一個右邊的子樹也要跟全部的左邊子樹匹配,總共同擁有左右子樹數量的乘積種情況),構造好之後作為當前樹的結果返回。 實現中還是有一些細節的,由於構造樹時兩邊要遍歷全部左右的匹配。然後接到根上面。
當然我們也能夠像在Unique Binary Search Trees中那樣存儲全部的子樹歷史信息,然後進行拼合,盡管能夠省一些時間,可是終於還是逃只是每一個結果要一次運算。時間復雜度還是非多項式的,而且要耗費大量的空間。感覺這種意義就不是非常大了。
這道題是求解全部可行的二叉查找樹,從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