<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>二叉树 on On My Way</title>
    <link>https://tuanzi-wow.cn/tags/%E4%BA%8C%E5%8F%89%E6%A0%91/</link>
    <description>Recent content in 二叉树 on On My Way</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Sun, 06 Sep 2026 00:00:00 +0800</lastBuildDate>
    <atom:link href="https://tuanzi-wow.cn/tags/%E4%BA%8C%E5%8F%89%E6%A0%91/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>HOT100 · 二叉树</title>
      <link>https://tuanzi-wow.cn/leetcode%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/hot100/hot100-binary-tree/</link>
      <pubDate>Sun, 06 Sep 2026 00:00:00 +0800</pubDate>
      <guid>https://tuanzi-wow.cn/leetcode%E5%88%B7%E9%A2%98%E8%AE%B0%E5%BD%95/hot100/hot100-binary-tree/</guid>
      <description>HOT100 二叉树专题：遍历、深度、翻转、最近公共祖先等常见题型与解法。</description>
      <content:encoded><![CDATA[<h3 id="1二叉树的中序遍历">1.二叉树的中序遍历：</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for a binary tree node.
</span></span><span class="line"><span class="cl"># class TreeNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, val=0, left=None, right=None):
</span></span><span class="line"><span class="cl">#         self.val = val
</span></span><span class="line"><span class="cl">#         self.left = left
</span></span><span class="line"><span class="cl">#         self.right = right
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    global ans = []
</span></span><span class="line"><span class="cl">    def inorderTraversal(self, root: Optional[TreeNode]) -&gt; List[int]:
</span></span><span class="line"><span class="cl">            if not root:
</span></span><span class="line"><span class="cl">                return []
</span></span><span class="line"><span class="cl">            
</span></span><span class="line"><span class="cl">            self.inorderTraversal(root.left)
</span></span><span class="line"><span class="cl">            ans.append(root.val)
</span></span><span class="line"><span class="cl">            self.inorderTraversal(root.right)
</span></span><span class="line"><span class="cl">            return ans
</span></span><span class="line"><span class="cl">        
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="2二叉树的最大深度">2.二叉树的最大深度：</h3>
<p>递递的归</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for a binary tree node.
</span></span><span class="line"><span class="cl"># class TreeNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, val=0, left=None, right=None):
</span></span><span class="line"><span class="cl">#         self.val = val
</span></span><span class="line"><span class="cl">#         self.left = left
</span></span><span class="line"><span class="cl">#         self.right = right
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def maxDepth(self, root: Optional[TreeNode]) -&gt; int:
</span></span><span class="line"><span class="cl">        if root == None:
</span></span><span class="line"><span class="cl">            return 0
</span></span><span class="line"><span class="cl">        l= self.maxDepth(root.left)
</span></span><span class="line"><span class="cl">        r = self.maxDepth(root.right)
</span></span><span class="line"><span class="cl">        return max(l,r)+1
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="3翻转二叉树">3.翻转二叉树：</h3>
<p>依旧递递的归：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for a binary tree node.
</span></span><span class="line"><span class="cl"># class TreeNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, val=0, left=None, right=None):
</span></span><span class="line"><span class="cl">#         self.val = val
</span></span><span class="line"><span class="cl">#         self.left = left
</span></span><span class="line"><span class="cl">#         self.right = right
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def invertTree(self, root: Optional[TreeNode]) -&gt; Optional[TreeNode]:
</span></span><span class="line"><span class="cl">            def invert(node):
</span></span><span class="line"><span class="cl">                if not node:
</span></span><span class="line"><span class="cl">                    return
</span></span><span class="line"><span class="cl">                node.left,node.right = node.right,node.left
</span></span><span class="line"><span class="cl">                invert(node.left)
</span></span><span class="line"><span class="cl">                invert(node.right)
</span></span><span class="line"><span class="cl">            invert(root)
</span></span><span class="line"><span class="cl">            return root
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="4对称二叉树">4.对称二叉树</h3>
<p>依旧递递的归</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for a binary tree node.
</span></span><span class="line"><span class="cl"># class TreeNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, val=0, left=None, right=None):
</span></span><span class="line"><span class="cl">#         self.val = val
</span></span><span class="line"><span class="cl">#         self.left = left
</span></span><span class="line"><span class="cl">#         self.right = right
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def isSymmetric(self, root: Optional[TreeNode]) -&gt; bool:
</span></span><span class="line"><span class="cl">      
</span></span><span class="line"><span class="cl">        def isduichen(lnode,rnode)-&gt;bool:
</span></span><span class="line"><span class="cl">            if not lnode and not rnode:
</span></span><span class="line"><span class="cl">                return True
</span></span><span class="line"><span class="cl">            if not (lnode and rnode):
</span></span><span class="line"><span class="cl">                return False
</span></span><span class="line"><span class="cl">            if lnode.val != rnode.val or lnode.val != rnode.val:
</span></span><span class="line"><span class="cl">                return False
</span></span><span class="line"><span class="cl">            return isduichen(lnode.left,rnode.right) and isduichen(lnode.right,rnode.left)
</span></span><span class="line"><span class="cl">        if not root:
</span></span><span class="line"><span class="cl">            return True
</span></span><span class="line"><span class="cl">        return isduichen(root.left,root.right)
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="5树的直径">5.树的直径</h3>
<p>算各个结点的左右深度之和并维持一个最大值</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for a binary tree node.
</span></span><span class="line"><span class="cl"># class TreeNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, val=0, left=None, right=None):
</span></span><span class="line"><span class="cl">#         self.val = val
</span></span><span class="line"><span class="cl">#         self.left = left
</span></span><span class="line"><span class="cl">#         self.right = right
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def diameterOfBinaryTree(self, root: TreeNode) -&gt; int:
</span></span><span class="line"><span class="cl">        self.ans = 1
</span></span><span class="line"><span class="cl">        def depth(root):
</span></span><span class="line"><span class="cl">            if not root: return 0
</span></span><span class="line"><span class="cl">            L = depth(root.left)
</span></span><span class="line"><span class="cl">            R = depth(root.right)
</span></span><span class="line"><span class="cl">            self.ans = max(self.ans, L + R + 1)
</span></span><span class="line"><span class="cl">            return max(L, R) + 1
</span></span><span class="line"><span class="cl">        depth(root)
</span></span><span class="line"><span class="cl">        return self.ans - 1
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="6二叉树的层序遍历">6.二叉树的层序遍历</h3>
<h4 id="题目描述">题目描述：</h4>
<p>给你二叉树的根节点 <code>root</code> ，返回其节点值的 <strong>层序遍历</strong></p>
<h4 id="题解">题解：</h4>
<p>使用队列辅助</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">from collections import deque
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def levelOrder(self, root: Optional[TreeNode]) -&gt; List[List[int]]:
</span></span><span class="line"><span class="cl">        if not root:
</span></span><span class="line"><span class="cl">            return []
</span></span><span class="line"><span class="cl">        ans = []
</span></span><span class="line"><span class="cl">        queue = deque([root])
</span></span><span class="line"><span class="cl">        while queue:
</span></span><span class="line"><span class="cl">            level = []
</span></span><span class="line"><span class="cl">            # 当前层有多少个节点
</span></span><span class="line"><span class="cl">            size = len(queue)
</span></span><span class="line"><span class="cl">            # 只处理当前层的节点
</span></span><span class="line"><span class="cl">            for _ in range(size):
</span></span><span class="line"><span class="cl">                node = queue.popleft()
</span></span><span class="line"><span class="cl">                level.append(node.val)
</span></span><span class="line"><span class="cl">                if node.left:
</span></span><span class="line"><span class="cl">                    queue.append(node.left)
</span></span><span class="line"><span class="cl">                if node.right:
</span></span><span class="line"><span class="cl">                    queue.append(node.right)
</span></span><span class="line"><span class="cl">            ans.append(level)
</span></span><span class="line"><span class="cl">        return ans
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="7将有序数组转换为二叉搜索树">7.将有序数组转换为二叉搜索树</h3>
<h4 id="题目描述-1">题目描述：</h4>
<p>给你一个整数数组 <code>nums</code> ，其中元素已经按 <strong>升序</strong> 排列，请你将其转换为一棵 平衡 二叉搜索树</p>
<h4 id="题解-1">题解：</h4>
<p>还是递归,我没招了</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def sortedArrayToBST(self, nums: List[int]) -&gt; Optional[TreeNode]:
</span></span><span class="line"><span class="cl">        def build(left, right):
</span></span><span class="line"><span class="cl">            if left &gt; right:
</span></span><span class="line"><span class="cl">                return None
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            mid = (left + right) // 2
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            root = TreeNode(nums[mid])
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            root.left = build(left, mid - 1)
</span></span><span class="line"><span class="cl">            root.right = build(mid + 1, right)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            return root
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        return build(0, len(nums) - 1)
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="8验证二叉搜索树">8.验证二叉搜索树:</h3>
<h4 id="题目描述-2">题目描述:</h4>
<p>给你一个二叉树的根节点 <code>root</code> ，判断其是否是一个有效的二叉搜索树。</p>
<p><strong>有效</strong> 二叉搜索树定义如下：</p>
<ul>
<li>节点的左子树只包含 <strong>严格小于</strong> 当前节点的数。</li>
<li>节点的右子树只包含 <strong>严格大于</strong> 当前节点的数。</li>
<li>所有左子树和右子树自身必须也是二叉搜索树。</li>
</ul>
<h4 id="题解-2">题解:</h4>
<p>依旧递递的归
要注意的是:不能只比较父节点和直接子节点,要为每个节点设置一个范围(我第一遍就错在这了)</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for a binary tree node.
</span></span><span class="line"><span class="cl"># class TreeNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, val=0, left=None, right=None):
</span></span><span class="line"><span class="cl">#         self.val = val
</span></span><span class="line"><span class="cl">#         self.left = left
</span></span><span class="line"><span class="cl">#         self.right = right
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def isValidBST(self, root: Optional[TreeNode],left = -inf,right = inf) -&gt; bool:
</span></span><span class="line"><span class="cl">        if not root:
</span></span><span class="line"><span class="cl">            return True
</span></span><span class="line"><span class="cl">        return left &lt; root.val &lt; right and self.isValidBST(root.left,left,root.val) and self.isValidBST(root.right,root.val,right)
</span></span><span class="line"><span class="cl">        
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="9二叉搜索树中第k小的元素">9.二叉搜索树中第K小的元素:</h3>
<h4 id="题目描述-3">题目描述:</h4>
<p>给定一个二叉搜索树的根节点 <code>root</code> ，和一个整数 <code>k</code> ，请你设计一个算法查找其中第 <code>k</code> 小的元素（<code>k</code> 从 1 开始计数）。</p>
<p>题解:
我的第一想法:遍历并排序</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for a binary tree node.
</span></span><span class="line"><span class="cl"># class TreeNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, val=0, left=None, right=None):
</span></span><span class="line"><span class="cl">#         self.val = val
</span></span><span class="line"><span class="cl">#         self.left = left
</span></span><span class="line"><span class="cl">#         self.right = right
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def kthSmallest(self, root: Optional[TreeNode], k: int) -&gt; int:
</span></span><span class="line"><span class="cl">        values = []
</span></span><span class="line"><span class="cl">        def visit(node):
</span></span><span class="line"><span class="cl">            if not node:
</span></span><span class="line"><span class="cl">                return
</span></span><span class="line"><span class="cl">            values.append(node.val)
</span></span><span class="line"><span class="cl">            visit(node.left)
</span></span><span class="line"><span class="cl">            visit(node.right)
</span></span><span class="line"><span class="cl">        visit(root)
</span></span><span class="line"><span class="cl">        values.sort()
</span></span><span class="line"><span class="cl">        return values[k-1]
</span></span></code></pre></td></tr></table>
</div>
</div><p>经典解法:中序遍历加技术:
BST的中序遍历是从小到大排序的,这个是迭代版本的,实质就是写中序遍历的过程,挺简单的</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def kthSmallest(self, root: Optional[TreeNode], k: int) -&gt; int:
</span></span><span class="line"><span class="cl">        stack = []
</span></span><span class="line"><span class="cl">        cur = root
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        while True:
</span></span><span class="line"><span class="cl">            while cur:
</span></span><span class="line"><span class="cl">                stack.append(cur)
</span></span><span class="line"><span class="cl">                cur = cur.left
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            cur = stack.pop()
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            k -= 1
</span></span><span class="line"><span class="cl">            if k == 0:
</span></span><span class="line"><span class="cl">                return cur.val
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            cur = cur.right
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="10二叉树的右视图">10.二叉树的右视图:</h3>
<h4 id="题目描述-4">题目描述:</h4>
<p>给定一个二叉树的 <strong>根节点</strong> <code>root</code>，想象自己站在它的右侧，按照从顶部到底部的顺序，返回从右侧所能看到的节点值。</p>
<h4 id="题解-3">题解:</h4>
<p>超绝队列配合层序遍历:结果就是层序遍历的每一层的最后一个值</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"># Definition for a binary tree node.
</span></span><span class="line"><span class="cl"># class TreeNode:
</span></span><span class="line"><span class="cl">#     def __init__(self, val=0, left=None, right=None):
</span></span><span class="line"><span class="cl">#         self.val = val
</span></span><span class="line"><span class="cl">#         self.left = left
</span></span><span class="line"><span class="cl">#         self.right = right
</span></span><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def rightSideView(self, root: Optional[TreeNode]) -&gt; List[int]:
</span></span><span class="line"><span class="cl">        if not root:
</span></span><span class="line"><span class="cl">            return []
</span></span><span class="line"><span class="cl">        quene = deque([root])
</span></span><span class="line"><span class="cl">        ans = []
</span></span><span class="line"><span class="cl">        while quene:
</span></span><span class="line"><span class="cl">            level = []
</span></span><span class="line"><span class="cl">            for _ in range(len(quene)):
</span></span><span class="line"><span class="cl">                node = quene.popleft()
</span></span><span class="line"><span class="cl">                if node.left:
</span></span><span class="line"><span class="cl">                    quene.append(node.left)
</span></span><span class="line"><span class="cl">                if node.right:
</span></span><span class="line"><span class="cl">                    quene.append(node.right)
</span></span><span class="line"><span class="cl">                level.append(node.val)
</span></span><span class="line"><span class="cl">            ans.append(level[-1])
</span></span><span class="line"><span class="cl">        return ans
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="11二叉树展开为链表">11.二叉树展开为链表:</h3>
<h4 id="题目描述-5">题目描述:</h4>
<p>给你二叉树的根结点 <code>root</code> ，请你将它展开为一个单链表：</p>
<ul>
<li>展开后的单链表应该同样使用 <code>TreeNode</code> ，其中 <code>right</code> 子指针指向链表中下一个结点，而左子指针始终为 <code>null</code> 。</li>
<li>展开后的单链表应该与二叉树 <a href="https://baike.baidu.com/item/%E5%85%88%E5%BA%8F%E9%81%8D%E5%8E%86/6442839?fr=aladdin"><strong>先序遍历</strong></a> 顺序相同。</li>
</ul>
<h4 id="题解-4">题解:</h4>
<p>找左子树的最右节点,并把原本的右子树接到那里</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def flatten(self, root: Optional[TreeNode]) -&gt; None:
</span></span><span class="line"><span class="cl">        cur = root
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        while cur:
</span></span><span class="line"><span class="cl">            if cur.left:
</span></span><span class="line"><span class="cl">                # 找左子树最右边的节点
</span></span><span class="line"><span class="cl">                pre = cur.left
</span></span><span class="line"><span class="cl">                while pre.right:
</span></span><span class="line"><span class="cl">                    pre = pre.right
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                # 原来的右子树接到这里
</span></span><span class="line"><span class="cl">                pre.right = cur.right
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                # 左子树搬到右边
</span></span><span class="line"><span class="cl">                cur.right = cur.left
</span></span><span class="line"><span class="cl">                cur.left = None
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            cur = cur.right
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="12从前序与中序遍历构造二叉树考408的来了你们聊">12.从前序与中序遍历构造二叉树(考408的来了,你们聊)</h3>
<h4 id="题目描述-6">题目描述:</h4>
<p>给定两个整数数组 <code>preorder</code> 和 <code>inorder</code> ，其中 <code>preorder</code> 是二叉树的<strong>先序遍历</strong>， <code>inorder</code> 是同一棵树的<strong>中序遍历</strong>，请构造二叉树并返回其根节点。</p>
<h4 id="题解-5">题解:</h4>
<p>思路:从先序遍历里面找到根节点,然后在中序遍历里面找到该节点,然后左边为其左子树,右边是其右子树,迭代或者递归进行</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">class Solution:
</span></span><span class="line"><span class="cl">    def buildTree(self, preorder: List[int], inorder: List[int]) -&gt; Optional[TreeNode]:
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        if not preorder:
</span></span><span class="line"><span class="cl">            return None
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        # 1. preorder 第一个节点是根
</span></span><span class="line"><span class="cl">        root_val = preorder[0]
</span></span><span class="line"><span class="cl">        root = TreeNode(root_val)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        # 2. 在 inorder 中找到根的位置
</span></span><span class="line"><span class="cl">        index = inorder.index(root_val)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        # 3. 划分左右子树
</span></span><span class="line"><span class="cl">        left_inorder = inorder[:index]
</span></span><span class="line"><span class="cl">        right_inorder = inorder[index + 1:]
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        # 左子树节点数量
</span></span><span class="line"><span class="cl">        left_size = len(left_inorder)
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        # 4. 递归构建左右子树
</span></span><span class="line"><span class="cl">        root.left = self.buildTree(
</span></span><span class="line"><span class="cl">            preorder[1:left_size + 1],
</span></span><span class="line"><span class="cl">            left_inorder
</span></span><span class="line"><span class="cl">        )
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        root.right = self.buildTree(
</span></span><span class="line"><span class="cl">            preorder[left_size + 1:],
</span></span><span class="line"><span class="cl">            right_inorder
</span></span><span class="line"><span class="cl">        )
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        return root
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="13路径总和">13.路径总和:</h3>
<h4 id="题目描述-7">题目描述:</h4>
<p>给定一个二叉树的根节点 <code>root</code> ，和一个整数 <code>targetSum</code> ，求该二叉树里节点值之和等于 <code>targetSum</code> 的 <strong>路径</strong> 的数目。</p>
<p><strong>路径</strong> 不需要从根节点开始，也不需要在叶子节点结束，但是路径方向必须是向下的（只能从父节点到子节点）。</p>
<h4 id="题解-6">题解:</h4>
<p>暂留:</p>
<h3 id="14二叉树的最近公共祖先">14.二叉树的最近公共祖先</h3>
<h4 id="题目描述-8">题目描述:</h4>
<p>给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。</p>
<p><a href="https://baike.baidu.com/item/%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B1%E7%A5%96%E5%85%88/8918834?fr=aladdin">百度百科</a>中最近公共祖先的定义为：“对于有根树 T 的两个节点 p、q，最近公共祖先表示为一个节点 x，满足 x 是 p、q 的祖先且 x 的深度尽可能大（<strong>一个节点也可以是它自己的祖先</strong>）。”</p>
<h4 id="题解-7">题解:</h4>
]]></content:encoded>
    </item>
  </channel>
</rss>
