题目描述
思路解析动画文字版
记住「DFS 先左后右收叶子 → 两序列比一比」,下面逐帧套它。关键是收集顺序必须是从左到右,所以递归先走左子树。
DFS 走到节点 30,它还有孩子,不是叶子,先往左子树深入。
DFS 走到节点 50,它还有孩子,不是叶子,先往左子树深入。
走到节点 60,它左右孩子都空,是叶子。把 60 追加进 左树 的叶序列。
左树 的叶序列又长一个:现在是 [60](绿色是刚收进来的 60)。
走到节点 70,它左右孩子都空,是叶子。把 70 追加进 左树 的叶序列。
左树 的叶序列又长一个:现在是 [60、70](绿色是刚收进来的 70)。
DFS 走到节点 10,它不是叶子;左子树是空的,转到右孩子 80 继续。
走到节点 80,它左右孩子都空,是叶子。把 80 追加进 左树 的叶序列。
左树 的叶序列又长一个:现在是 [60、70、80](绿色是刚收进来的 80)。
左树 整棵 DFS 走完,从左到右的叶序列定下来:[60、70、80](绿色三个叶子)。
DFS 走到节点 90,它还有孩子,不是叶子,先往左子树深入。
走到节点 60,它左右孩子都空,是叶子。把 60 追加进 右树 的叶序列。
右树 的叶序列又长一个:现在是 [60](绿色是刚收进来的 60)。
DFS 走到节点 40,它还有孩子,不是叶子,先往左子树深入。
走到节点 70,它左右孩子都空,是叶子。把 70 追加进 右树 的叶序列。
右树 的叶序列又长一个:现在是 [60、70](绿色是刚收进来的 70)。
走到节点 80,它左右孩子都空,是叶子。把 80 追加进 右树 的叶序列。
右树 的叶序列又长一个:现在是 [60、70、80](绿色是刚收进来的 80)。
右树 整棵 DFS 走完,从左到右的叶序列定下来:[60、70、80](绿色三个叶子)。
逐位比对两棵树的叶序列。第 1 位:左树是 60、右树是 60,相等,继续看下一位。
逐位比对两棵树的叶序列。第 2 位:左树是 70、右树是 70,相等,继续看下一位。
逐位比对两棵树的叶序列。第 3 位:左树是 80、右树是 80,相等,继续看下一位。
两棵树的叶序列 [60、70、80] 和 [60、70、80] 逐位都相等,所以两棵树叶子相似,返回 true。回头看,我们没有去比树的形状,只把各自的叶子从左到右拉成一条序列再比,形状再不同也不影响。
边界:单节点比根值、长度不同直接 false、空树叶序列为空。
两个追问:可同步生成叶子边比边退;DFS 天然给出从左到右顺序。
参考代码
from typing import List, Optionalclass TreeNode: def __init__(self, val=0, left=None, right=None): self.val=val; self.left=left; self.right=rightclass Solution: def leafSimilar(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> bool: def leaves(node, out): if not node: return if not node.left and not node.right: out.append(node.val); return leaves(node.left, out); leaves(node.right, out) a, b = [], [] leaves(root1, a); leaves(root2, b) return a == b复杂度
- 时间:O(n1 + n2),两棵树各遍历一次,n1、n2 是两树节点数;最后比较序列是叶子个数级,不超过 O(n)
- 空间:O(h1 + h2 + L1 + L2),递归栈深度等于两树高 h1、h2,外加显式保存的两条叶序列 L1、L2(叶子数);最坏树退化成链、叶子也多时可到 O(n1 + n2)。若想压到 O(h1+h2),得改成同步生成两树叶子、边走边比
易错点
面试追问把动画讲成自己的话
追问能不能边 DFS 边比较、省掉存整条序列?
追问为什么用 DFS 而不是 BFS 来收叶子?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
不同的二叉搜索树 II
LeetCode 95 · 中等 · 沿着 树套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题