<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>generate Archives - Huahua&#039;s Tech Road</title>
	<atom:link href="https://zxi.mytechroad.com/blog/tag/generate/feed/" rel="self" type="application/rss+xml" />
	<link>https://zxi.mytechroad.com/blog/tag/generate/</link>
	<description></description>
	<lastBuildDate>Mon, 03 Sep 2018 17:50:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0.8</generator>

<image>
	<url>https://zxi.mytechroad.com/blog/wp-content/uploads/2017/09/cropped-photo-32x32.jpg</url>
	<title>generate Archives - Huahua&#039;s Tech Road</title>
	<link>https://zxi.mytechroad.com/blog/tag/generate/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>花花酱 LeetCode 95. Unique Binary Search Trees II</title>
		<link>https://zxi.mytechroad.com/blog/uncategorized/leetcode-95-unique-binary-search-trees-ii/</link>
					<comments>https://zxi.mytechroad.com/blog/uncategorized/leetcode-95-unique-binary-search-trees-ii/#respond</comments>
		
		<dc:creator><![CDATA[zxi]]></dc:creator>
		<pubDate>Wed, 07 Mar 2018 17:20:29 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[BST]]></category>
		<category><![CDATA[generate]]></category>
		<category><![CDATA[medium]]></category>
		<category><![CDATA[unique]]></category>
		<guid isPermaLink="false">http://zxi.mytechroad.com/blog/?p=2015</guid>

					<description><![CDATA[<p>Problem https://leetcode.com/problems/unique-binary-search-trees-ii/description/ Given an integer n, generate all structurally unique BST&#8217;s (binary search trees) that store values 1&#8230;n. For example, Given n = 3, your program should return all 5&#8230;</p>
<p>The post <a rel="nofollow" href="https://zxi.mytechroad.com/blog/uncategorized/leetcode-95-unique-binary-search-trees-ii/">花花酱 LeetCode 95. Unique Binary Search Trees II</a> appeared first on <a rel="nofollow" href="https://zxi.mytechroad.com/blog">Huahua&#039;s Tech Road</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1><strong>Problem</strong></h1>
<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>
<p>Given an integer <i>n</i>, generate all structurally unique <b>BST&#8217;s</b> (binary search trees) that store values 1&#8230;<i>n</i>.</p>
<p>For example,<br />
Given <i>n</i> = 3, your program should return all 5 unique BST&#8217;s shown below.</p><pre class="crayon-plain-tag">1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3</pre><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"> </ins></p>
<h1><strong>Idea: Recursion</strong></h1>
<p>for i in 1..n: pick i as root,<br />
left subtrees can be generated in the same way for n_l = 1 &#8230; i &#8211; 1,<br />
right subtrees can be generated in the same way for n_r = i + 1, &#8230;, n<br />
def gen(s, e):<br />
return [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>
<p># of trees:</p>
<p>n = 0: 1<br />
n = 1: 1<br />
n = 2: 2<br />
n = 3: 5<br />
n = 4: 14<br />
n = 5: 42<br />
n = 6: 132<br />
&#8230;<br />
Trees(n) = Trees(0)*Trees(n-1) + Trees(1)*Trees(n-2) + &#8230; + Tress(n-1)*Trees(0)</p>
<p>Time complexity: O(3^n)</p>
<p>Space complexity: O(3^n)</p>
<p><div class="responsive-tabs">
<h2 class="tabtitle">C++</h2>
<div class="tabcontent">
</p><pre class="crayon-plain-tag">// Author: Huahua
// Running time: 16 ms
class Solution {
public:
  vector&lt;TreeNode*&gt; generateTrees(int n) {
    if (n == 0) return {};
    const auto&amp; ans = generateTrees(1, n);
    cout &lt;&lt; ans.size() &lt;&lt; endl;
    return ans;
  }
private:
  vector&lt;TreeNode*&gt; generateTrees(int l, int r) {
    if (l &gt; r) return { nullptr };
    vector&lt;TreeNode*&gt; ans;
    for (int i = l; i &lt;= r; ++i)
      for (TreeNode* left : generateTrees(l, i - 1))
        for (TreeNode* right : generateTrees(i + 1, r)) {
          ans.push_back(new TreeNode(i));
          ans.back()-&gt;left = left;
          ans.back()-&gt;right = right;
        }
    return ans;
  }
};</pre><p></div><h2 class="tabtitle">Java</h2>
<div class="tabcontent">
</p><pre class="crayon-plain-tag">// Author: Huahua 4 ms
class Solution {
  public List&lt;TreeNode&gt; generateTrees(int n) {
    if (n == 0) return new ArrayList&lt;TreeNode&gt;();
    return generateTrees(1, n);
  }
  
  private List&lt;TreeNode&gt; generateTrees(int l, int r) {
    List&lt;TreeNode&gt; ans = new ArrayList&lt;&gt;();
    if (l &gt; r) {      
      ans.add(null);
      return ans;
    }
    for (int i = l; i &lt;= r; ++i)
      for (TreeNode left : generateTrees(l, i - 1))
        for (TreeNode right: generateTrees(i + 1, r)) {
          TreeNode root = new TreeNode(i);
          root.left = left;
          root.right = right;
          ans.add(root);
        }          
    return ans;
  }
}</pre><p></div><h2 class="tabtitle">Python 3</h2>
<div class="tabcontent">
</p><pre class="crayon-plain-tag">"""
Author: Huahua
Running time: 84 ms
"""
class Solution:
  def generateTrees(self, n):
    def newTree(x, l, r): 
      t = TreeNode(x)
      t.left = l
      t.right = r
      return t
    
    def gen(s, e):      
      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]
        
    return gen(1, n) if n &gt; 0 else []</pre><p></div></div></p>
<h1>Solution 2: DP</h1>
<p><div class="responsive-tabs">
<h2 class="tabtitle">Java</h2>
<div class="tabcontent">
</p><pre class="crayon-plain-tag">// Author: Huahua, 3 ms
class Solution {
  public List&lt;TreeNode&gt; generateTrees(int n) {
    if (n == 0) return new ArrayList&lt;TreeNode&gt;();
    List&lt;TreeNode&gt;[] dp = new List[n + 1];
    dp[0] = new ArrayList&lt;TreeNode&gt;();
    dp[0].add(null);
    for (int i = 1; i &lt;= n; ++i) {
      dp[i] = new ArrayList&lt;TreeNode&gt;();
      for (int j = 0; j &lt; i; ++j)
        for (TreeNode left : dp[j])
          for (TreeNode right: dp[i - j - 1]) {
            TreeNode root = new TreeNode(j + 1);
            root.left = left;
            root.right = clone(right, j + 1);
            dp[i].add(root);
        }          
      }
    return dp[n];
  }
  
  private TreeNode clone(TreeNode root, int delta) {
    if (root == null) return root;
    TreeNode node = new TreeNode(root.val + delta);
    node.left = clone(root.left, delta);
    node.right = clone(root.right, delta);
    return node;
  }
}</pre><p></div></div></p>
<h1><strong>Related Problems</strong></h1>
<ul>
<li><a href="https://zxi.mytechroad.com/blog/tree/leetcode-894-all-possible-full-binary-trees/">花花酱 LeetCode 894. All Possible Full Binary Trees</a></li>
</ul>
<p>&nbsp;</p>
<p>The post <a rel="nofollow" href="https://zxi.mytechroad.com/blog/uncategorized/leetcode-95-unique-binary-search-trees-ii/">花花酱 LeetCode 95. Unique Binary Search Trees II</a> appeared first on <a rel="nofollow" href="https://zxi.mytechroad.com/blog">Huahua&#039;s Tech Road</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://zxi.mytechroad.com/blog/uncategorized/leetcode-95-unique-binary-search-trees-ii/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
