{"id":2015,"date":"2018-03-07T09:20:29","date_gmt":"2018-03-07T17:20:29","guid":{"rendered":"http:\/\/zxi.mytechroad.com\/blog\/?p=2015"},"modified":"2018-09-03T10:50:25","modified_gmt":"2018-09-03T17:50:25","slug":"leetcode-95-unique-binary-search-trees-ii","status":"publish","type":"post","link":"https:\/\/zxi.mytechroad.com\/blog\/uncategorized\/leetcode-95-unique-binary-search-trees-ii\/","title":{"rendered":"\u82b1\u82b1\u9171 LeetCode 95. Unique Binary Search Trees II"},"content":{"rendered":"<h1><strong>Problem<\/strong><\/h1>\n<p><a href=\"https:\/\/leetcode.com\/problems\/unique-binary-search-trees-ii\/description\/\">https:\/\/leetcode.com\/problems\/unique-binary-search-trees-ii\/description\/<\/a><\/p>\n<p>Given an integer\u00a0<i>n<\/i>, generate all structurally unique\u00a0<b>BST&#8217;s<\/b>\u00a0(binary search trees) that store values 1&#8230;<i>n<\/i>.<\/p>\n<p>For example,<br \/>\nGiven\u00a0<i>n<\/i>\u00a0= 3, your program should return all 5 unique BST&#8217;s shown below.<\/p>\n<pre class=\"\">   1         3     3      2      1\r\n    \\       \/     \/      \/ \\      \\\r\n     3     2     1      1   3      2\r\n    \/     \/       \\                 \\\r\n   2     1         2                 3\r\n<\/pre>\n<p><ins class=\"adsbygoogle\" style=\"display: block; text-align: center;\" data-ad-layout=\"in-article\" data-ad-format=\"fluid\" data-ad-client=\"ca-pub-2404451723245401\" data-ad-slot=\"7983117522\">\u00a0<\/ins><\/p>\n<h1><strong>Idea: Recursion<\/strong><\/h1>\n<p>for i in 1..n: pick i as root,<br \/>\nleft subtrees can be generated in the same way for n_l = 1 &#8230; i &#8211; 1,<br \/>\nright subtrees can be generated in the same way for n_r = i + 1, &#8230;, n<br \/>\ndef gen(s, e):<br \/>\nreturn [tree(i, l, r) for l in gen(s, i &#8211; 1) for r in gen(i + 1, e) for i in range(s, e+1)<\/p>\n<p># of trees:<\/p>\n<p>n = 0: 1<br \/>\nn = 1: 1<br \/>\nn = 2: 2<br \/>\nn = 3: 5<br \/>\nn = 4: 14<br \/>\nn = 5: 42<br \/>\nn = 6: 132<br \/>\n&#8230;<br \/>\nTrees(n) = Trees(0)*Trees(n-1) + Trees(1)*Trees(n-2) + &#8230; + Tress(n-1)*Trees(0)<\/p>\n<p>Time complexity: O(3^n)<\/p>\n<p>Space complexity: O(3^n)<\/p>\n<div class=\"responsive-tabs\">\n<h2 class=\"tabtitle\">C++<\/h2>\n<div class=\"tabcontent\">\n\n<pre class=\"lang:c++ decode:true \">\/\/ Author: Huahua\r\n\/\/ Running time: 16 ms\r\nclass Solution {\r\npublic:\r\n  vector&lt;TreeNode*&gt; generateTrees(int n) {\r\n    if (n == 0) return {};\r\n    const auto&amp; ans = generateTrees(1, n);\r\n    cout &lt;&lt; ans.size() &lt;&lt; endl;\r\n    return ans;\r\n  }\r\nprivate:\r\n  vector&lt;TreeNode*&gt; generateTrees(int l, int r) {\r\n    if (l &gt; r) return { nullptr };\r\n    vector&lt;TreeNode*&gt; ans;\r\n    for (int i = l; i &lt;= r; ++i)\r\n      for (TreeNode* left : generateTrees(l, i - 1))\r\n        for (TreeNode* right : generateTrees(i + 1, r)) {\r\n          ans.push_back(new TreeNode(i));\r\n          ans.back()-&gt;left = left;\r\n          ans.back()-&gt;right = right;\r\n        }\r\n    return ans;\r\n  }\r\n};<\/pre>\n\n<\/div><h2 class=\"tabtitle\">Java<\/h2>\n<div class=\"tabcontent\">\n\n<pre class=\"lang:java decode:true\">\/\/ Author: Huahua 4 ms\r\nclass Solution {\r\n  public List&lt;TreeNode&gt; generateTrees(int n) {\r\n    if (n == 0) return new ArrayList&lt;TreeNode&gt;();\r\n    return generateTrees(1, n);\r\n  }\r\n  \r\n  private List&lt;TreeNode&gt; generateTrees(int l, int r) {\r\n    List&lt;TreeNode&gt; ans = new ArrayList&lt;&gt;();\r\n    if (l &gt; r) {      \r\n      ans.add(null);\r\n      return ans;\r\n    }\r\n    for (int i = l; i &lt;= r; ++i)\r\n      for (TreeNode left : generateTrees(l, i - 1))\r\n        for (TreeNode right: generateTrees(i + 1, r)) {\r\n          TreeNode root = new TreeNode(i);\r\n          root.left = left;\r\n          root.right = right;\r\n          ans.add(root);\r\n        }          \r\n    return ans;\r\n  }\r\n}<\/pre>\n\n<\/div><h2 class=\"tabtitle\">Python 3<\/h2>\n<div class=\"tabcontent\">\n\n<pre class=\"lang:python decode:true \">\"\"\"\r\nAuthor: Huahua\r\nRunning time: 84 ms\r\n\"\"\"\r\nclass Solution:\r\n  def generateTrees(self, n):\r\n    def newTree(x, l, r): \r\n      t = TreeNode(x)\r\n      t.left = l\r\n      t.right = r\r\n      return t\r\n    \r\n    def gen(s, e):      \r\n      return [newTree(i, l, r) for i in range(s, e + 1) for l in gen(s, i - 1) for r in gen(i + 1, e)] or [None]\r\n        \r\n    return gen(1, n) if n &gt; 0 else []<\/pre>\n<\/div><\/div>\n<h1>Solution 2: DP<\/h1>\n<div class=\"responsive-tabs\">\n<h2 class=\"tabtitle\">Java<\/h2>\n<div class=\"tabcontent\">\n\n<pre class=\"lang:java decode:true \">\/\/ Author: Huahua, 3 ms\r\nclass Solution {\r\n  public List&lt;TreeNode&gt; generateTrees(int n) {\r\n    if (n == 0) return new ArrayList&lt;TreeNode&gt;();\r\n    List&lt;TreeNode&gt;[] dp = new List[n + 1];\r\n    dp[0] = new ArrayList&lt;TreeNode&gt;();\r\n    dp[0].add(null);\r\n    for (int i = 1; i &lt;= n; ++i) {\r\n      dp[i] = new ArrayList&lt;TreeNode&gt;();\r\n      for (int j = 0; j &lt; i; ++j)\r\n        for (TreeNode left : dp[j])\r\n          for (TreeNode right: dp[i - j - 1]) {\r\n            TreeNode root = new TreeNode(j + 1);\r\n            root.left = left;\r\n            root.right = clone(right, j + 1);\r\n            dp[i].add(root);\r\n        }          \r\n      }\r\n    return dp[n];\r\n  }\r\n  \r\n  private TreeNode clone(TreeNode root, int delta) {\r\n    if (root == null) return root;\r\n    TreeNode node = new TreeNode(root.val + delta);\r\n    node.left = clone(root.left, delta);\r\n    node.right = clone(root.right, delta);\r\n    return node;\r\n  }\r\n}<\/pre>\n<\/div><\/div>\n<h1><strong>Related Problems<\/strong><\/h1>\n<ul>\n<li><a href=\"https:\/\/zxi.mytechroad.com\/blog\/tree\/leetcode-894-all-possible-full-binary-trees\/\">\u82b1\u82b1\u9171 LeetCode 894. All Possible Full Binary Trees<\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Problem https:\/\/leetcode.com\/problems\/unique-binary-search-trees-ii\/description\/ Given an integer\u00a0n, generate all structurally unique\u00a0BST&#8217;s\u00a0(binary search trees) that store values 1&#8230;n. For example, Given\u00a0n\u00a0= 3, your program should return all 5&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[74,239,177,240],"class_list":["post-2015","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-bst","tag-generate","tag-medium","tag-unique","entry","simple"],"_links":{"self":[{"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/posts\/2015","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/comments?post=2015"}],"version-history":[{"count":8,"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/posts\/2015\/revisions"}],"predecessor-version":[{"id":3834,"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/posts\/2015\/revisions\/3834"}],"wp:attachment":[{"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/media?parent=2015"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/categories?post=2015"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zxi.mytechroad.com\/blog\/wp-json\/wp\/v2\/tags?post=2015"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}