17 lines
12 KiB
HTML
17 lines
12 KiB
HTML
<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><meta name="X-UA-Compatible" content="IE=edge"><title> leetcode-543 · MarkDown</title><meta name="description" content="leetcode-543 - Ching"><meta name="viewport" content="width=device-width, initial-scale=1"><link rel="short icon" href="/favicon.png"><link rel="stylesheet" href="/css/apollo.css"><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,600" type="text/css"><meta name="generator" content="Hexo 6.0.0"><link rel="alternate" href="/atom.xml" title="MarkDown" type="application/atom+xml">
|
||
</head><body><header><a href="/" class="logo-link"><img src="/logo.png"></a><ul class="nav nav-list"><li class="nav-list-item"><a href="/" target="_self" class="nav-list-link">ALL</a></li><li class="nav-list-item"><a href="/categories/leetcode/" target="_self" class="nav-list-link">LEETCODE</a></li><li class="nav-list-item"><a href="/atom.xml" target="_self" class="nav-list-link">RSS</a></li></ul></header><section class="container"><div class="post"><article class="post-block"><h1 class="post-title">leetcode-543</h1><div class="post-meta"><div class="post-time">2020年3月25日</div></div><div class="post-content"><h3 id="543-二叉树的直径"><a href="#543-二叉树的直径" class="headerlink" title="543. 二叉树的直径"></a>543. 二叉树的直径</h3><p><a target="_blank" rel="noopener" href="https://leetcode-cn.com/problems/diameter-of-binary-tree/">题目</a></p>
|
||
<span id="more"></span>
|
||
|
||
|
||
|
||
<p>这题做出来了但是没有通过运行时间的测试,主要还是没想明白二叉树的直径到底是什么东西,用了个蠢办法。</p>
|
||
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Definition for a binary tree node.</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">TreeNode</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span>(<span class="params">self, x</span>):</span></span><br><span class="line"> self.val = x</span><br><span class="line"> self.left = <span class="literal">None</span></span><br><span class="line"> self.right = <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">diameterOfBinaryTree</span>(<span class="params">self, root: TreeNode</span>) -> <span class="built_in">int</span>:</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> root:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> last_node = -<span class="number">1</span></span><br><span class="line"> routes = []</span><br><span class="line"> start = root</span><br><span class="line"> node_stack = [root]</span><br><span class="line"> <span class="keyword">while</span> (start.left <span class="keyword">or</span> start.right <span class="keyword">or</span> node_stack):</span><br><span class="line"> <span class="keyword">if</span> start != node_stack[-<span class="number">1</span>]:</span><br><span class="line"> node_stack.append(start)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> last_node == start.right:</span><br><span class="line"> node_stack = node_stack[:-<span class="number">1</span>]</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> node_stack:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> last_node = start</span><br><span class="line"> start = node_stack[-<span class="number">1</span>]</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> start.left <span class="keyword">and</span> last_node != start.left:</span><br><span class="line"> start = start.left</span><br><span class="line"> last_node = start</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> start.right:</span><br><span class="line"> start = start.right</span><br><span class="line"> last_node = start</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"></span><br><span class="line"> routes.append(node_stack)</span><br><span class="line"> node_stack = node_stack[:-<span class="number">1</span>]</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> node_stack:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> last_node = start</span><br><span class="line"> start = node_stack[-<span class="number">1</span>]</span><br><span class="line"></span><br><span class="line"> max_l = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> route <span class="keyword">in</span> routes:</span><br><span class="line"> <span class="keyword">for</span> route_ <span class="keyword">in</span> routes:</span><br><span class="line"> intersection = <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span> route != route_:</span><br><span class="line"> intersection = <span class="built_in">len</span>(<span class="built_in">set</span>(route).intersection(<span class="built_in">set</span>(route_)))</span><br><span class="line"> <span class="keyword">if</span> intersection:</span><br><span class="line"> intersection -= <span class="number">1</span></span><br><span class="line"> max_l = <span class="built_in">max</span>(max_l, <span class="built_in">len</span>(<span class="built_in">set</span>(route)| <span class="built_in">set</span>(route_)) - intersection)</span><br><span class="line"> <span class="keyword">return</span> max_l - <span class="number">1</span></span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<p>L43 之前做的是以深度优先的方式遍历一遍树,得出每个点的路径。后面的是将所有路径组合在一起得出任意两个点间的路径,算出最大长度。</p>
|
||
<p>其实以某个点为根节点的树的直径,就是某个节点的<strong>左子树的深度和右子树的深度的和</strong>,用递归来处理这个会比较容易理解</p>
|
||
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>(<span class="params"><span class="built_in">object</span></span>):</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">diameterOfBinaryTree</span>(<span class="params">self, root</span>):</span></span><br><span class="line"> self.ans = <span class="number">1</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">depth</span>(<span class="params">node</span>):</span></span><br><span class="line"> <span class="comment"># 访问到空节点了,返回0</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> node: <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> <span class="comment"># 左儿子为根的子树的深度</span></span><br><span class="line"> L = depth(node.left)</span><br><span class="line"> <span class="comment"># 右儿子为根的子树的深度</span></span><br><span class="line"> R = depth(node.right)</span><br><span class="line"> <span class="comment"># 计算d_node即L+R+1 并更新ans</span></span><br><span class="line"> self.ans = <span class="built_in">max</span>(self.ans, L+R+<span class="number">1</span>)</span><br><span class="line"> <span class="comment"># 返回该节点为根的子树的深度</span></span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">max</span>(L, R) + <span class="number">1</span></span><br><span class="line"></span><br><span class="line"> depth(root)</span><br><span class="line"> <span class="keyword">return</span> self.ans - <span class="number">1</span></span><br><span class="line"></span><br><span class="line">作者:LeetCode-Solution</span><br><span class="line">链接:https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/er-cha-shu-de-zhi-jing-by-leetcode-solution/</span><br><span class="line">来源:力扣(LeetCode)</span><br><span class="line">著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
</div></article></div></section><footer><div class="paginator"><a href="/2020/03/25/leetcode-409/" class="prev">PRVE</a><a href="/2020/03/23/leetcode-225/" class="next">NEXT</a></div><div class="copyright"><p>© 2016 - 2022 <a href="http://blog.tunpok.com">Ching</a>, unless otherwise noted.</p></div></footer><script src="https://cdn.bootcss.com/mathjax/2.5.3/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script></body></html> |