73861
73861
<li class="md-nav__item">
73862
73862
<a href="#_3" class="md-nav__link">
73863
73863
<span class="md-ellipsis">
73864
- 方法一
73864
+ 方法一:递归
73865
73865
</span>
73866
73866
</a>
73867
73867
@@ -80419,7 +80419,16 @@ <h2 id="_1">题目描述</h2>
80419
80419
<h2 id="_2">解法</h2>
80420
80420
<!-- solution:start -->
80421
80421
80422
- <h3 id="_3">方法一</h3>
80422
+ <h3 id="_3">方法一:递归</h3>
80423
+ <p>我们设计一个函数 $\text{dfs}(A, B)$,用于判断树 A 中以节点 A 为根节点的子树是否包含树 B。</p>
80424
+ <p>函数 $\text{dfs}(A, B)$ 的执行步骤如下:</p>
80425
+ <ol>
80426
+ <li>如果树 B 为空,则树 B 是树 A 的子结构,返回 <code>true</code>;</li>
80427
+ <li>如果树 A 为空,或者树 A 的根节点的值不等于树 B 的根节点的值,则树 B 不是树 A 的子结构,返回 <code>false</code>;</li>
80428
+ <li>判断树 A 的左子树是否包含树 B,即调用 $\text{dfs}(A.left, B)$,并且判断树 A 的右子树是否包含树 B,即调用 $\text{dfs}(A.right, B)$。如果其中有一个函数返回 <code>false</code>,则树 B 不是树 A 的子结构,返回 <code>false</code>;否则,返回 <code>true</code>。</li>
80429
+ </ol>
80430
+ <p>在函数 <code>isSubStructure</code> 中,我们首先判断树 A 和树 B 是否为空,如果其中有一个为空,则树 B 不是树 A 的子结构,返回 <code>false</code>。然后,我们调用 $\text{dfs}(A, B)$,判断树 A 是否包含树 B。如果是,则返回 <code>true</code>;否则,递归判断树 A 的左子树是否包含树 B,以及树 A 的右子树是否包含树 B。如果其中有一个返回 <code>true</code>,则树 B 是树 A 的子结构,返回 <code>true</code>;否则,返回 <code>false</code>。</p>
80431
+ <p>时间复杂度 $O(n \times m)$,空间复杂度 $O(n)$。其中 $n$ 和 $m$ 分别是树 A 和树 B 的节点个数。</p>
80423
80432
<div class="tabbed-set tabbed-alternate" data-tabs="1:8"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><input id="__tabbed_1_3" name="__tabbed_1" type="radio" /><input id="__tabbed_1_4" name="__tabbed_1" type="radio" /><input id="__tabbed_1_5" name="__tabbed_1" type="radio" /><input id="__tabbed_1_6" name="__tabbed_1" type="radio" /><input id="__tabbed_1_7" name="__tabbed_1" type="radio" /><input id="__tabbed_1_8" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Python3</label><label for="__tabbed_1_2">Java</label><label for="__tabbed_1_3">C++</label><label for="__tabbed_1_4">Go</label><label for="__tabbed_1_5">TypeScript</label><label for="__tabbed_1_6">Rust</label><label for="__tabbed_1_7">JavaScript</label><label for="__tabbed_1_8">C#</label></div>
80424
80433
<div class="tabbed-content">
80425
80434
<div class="tabbed-block">
@@ -80546,7 +80555,13 @@ <h3 id="_3">方法一</h3>
80546
80555
<span class="normal">19</span>
80547
80556
<span class="normal">20</span>
80548
80557
<span class="normal">21</span>
80549
- <span class="normal">22</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="cm">/**</span>
80558
+ <span class="normal">22</span>
80559
+ <span class="normal">23</span>
80560
+ <span class="normal">24</span>
80561
+ <span class="normal">25</span>
80562
+ <span class="normal">26</span>
80563
+ <span class="normal">27</span>
80564
+ <span class="normal">28</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="cm">/**</span>
80550
80565
<span class="cm"> * Definition for a binary tree node.</span>
80551
80566
<span class="cm"> * struct TreeNode {</span>
80552
80567
<span class="cm"> * int val;</span>
@@ -80558,13 +80573,19 @@ <h3 id="_3">方法一</h3>
80558
80573
<span class="k">class</span><span class="w"> </span><span class="nc">Solution</span><span class="w"> </span><span class="p">{</span>
80559
80574
<span class="k">public</span><span class="o">:</span>
80560
80575
<span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">isSubStructure</span><span class="p">(</span><span class="n">TreeNode</span><span class="o">*</span><span class="w"> </span><span class="n">A</span><span class="p">,</span><span class="w"> </span><span class="n">TreeNode</span><span class="o">*</span><span class="w"> </span><span class="n">B</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
80561
- <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">A</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="o">!</span><span class="n">B</span><span class="p">)</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
80576
+ <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">A</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="o">!</span><span class="n">B</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
80577
+ <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nb">false</span><span class="p">;</span>
80578
+ <span class="w"> </span><span class="p">}</span>
80562
80579
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">dfs</span><span class="p">(</span><span class="n">A</span><span class="p">,</span><span class="w"> </span><span class="n">B</span><span class="p">)</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">isSubStructure</span><span class="p">(</span><span class="n">A</span><span class="o">-></span><span class="n">left</span><span class="p">,</span><span class="w"> </span><span class="n">B</span><span class="p">)</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">isSubStructure</span><span class="p">(</span><span class="n">A</span><span class="o">-></span><span class="n">right</span><span class="p">,</span><span class="w"> </span><span class="n">B</span><span class="p">);</span>
80563
80580
<span class="w"> </span><span class="p">}</span>
80564
80581
80565
80582
<span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">dfs</span><span class="p">(</span><span class="n">TreeNode</span><span class="o">*</span><span class="w"> </span><span class="n">A</span><span class="p">,</span><span class="w"> </span><span class="n">TreeNode</span><span class="o">*</span><span class="w"> </span><span class="n">B</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
80566
- <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">B</span><span class="p">)</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
80567
- <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">A</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">A</span><span class="o">-></span><span class="n">val</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">B</span><span class="o">-></span><span class="n">val</span><span class="p">)</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
80583
+ <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">B</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
80584
+ <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nb">true</span><span class="p">;</span>
80585
+ <span class="w"> </span><span class="p">}</span>
80586
+ <span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">A</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">A</span><span class="o">-></span><span class="n">val</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">B</span><span class="o">-></span><span class="n">val</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
80587
+ <span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nb">false</span><span class="p">;</span>
80588
+ <span class="w"> </span><span class="p">}</span>
80568
80589
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">dfs</span><span class="p">(</span><span class="n">A</span><span class="o">-></span><span class="n">left</span><span class="p">,</span><span class="w"> </span><span class="n">B</span><span class="o">-></span><span class="n">left</span><span class="p">)</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">dfs</span><span class="p">(</span><span class="n">A</span><span class="o">-></span><span class="n">right</span><span class="p">,</span><span class="w"> </span><span class="n">B</span><span class="o">-></span><span class="n">right</span><span class="p">);</span>
80569
80590
<span class="w"> </span><span class="p">}</span>
80570
80591
<span class="p">};</span>
0 commit comments