100. 相同的树(简单)
Blind 75 › 100. 相同的树(简单) (第 3 章)
题目
给定两棵二叉树的根节点 p 和 q,判断这两棵树是否完全相同。
「相同」包含两层:结构相同(每个位置要么两边都有节点、要么两边都为空)以及对应节点的值相同。两个条件同时满足才算相同。
自造示例:
p = [5,4,8],q = [5,4,8]→true(根、左、右一一对应相等)。p = [5,4],q = [5,null,4]→false(一个的左子是 4,另一个的左子是空,结构不同)。p = [2,1,3],q = [2,3,1]→false(左右子节点的位置互换,值对不上)。
约束:两棵树的节点数都在 0 ~ 100;节点值在 -104 ~ 104。
思路
一句话:同时从两个根节点往下走,逐点比对「是否都空、值是否相等」,再把问题交给左右子树。
最直白的想法是把两棵树各自遍历成一个序列,再比较序列。可行,但绕:如果不显式保留 null 占位,[1,2] 和 [1,null,2] 在前序遍历里都可能写成 1, 2,分不清结构;补上占位之后又等于重写了整道题的判定逻辑。
关键观察:两棵树相同,当且仅当当前根值相等、左子树相同、右子树相同。这句话本身就是一个递归定义——不用展开成序列,直接用两个指针 p、q 对齐同一位置判断即可。
于是选定做法:递归 + 同步遍历。每一步只处理当前这一对节点,其余交给递归,结构最贴合定义。
解法
把「当前这一对节点是否相同」拆成四种情况,按顺序判断:
- 两个都空 → 两侧都走到底且结构一致,返回
true。 - 一个空、一个非空 → 结构不同,返回
false。 - 两个都非空但值不同 → 返回
false。 - 值相同 → 递归比较
左对左、右对右,两边都为真才返回true。
| 当前 p | 当前 q | 判断 | 结果 |
|---|---|---|---|
| 空 | 空 | 都到底 | true |
| 空 | 非空 | 结构不同 | false |
| 非空 | 空 | 结构不同 | false |
| 非空 | 非空但值不同 | 值不同 | false |
| 非空 | 非空且值相同 | 继续比左右子树 | 左子树相同 && 右子树相同 |
下图把上面 4 个步骤串成流程,并逐步演示:


本篇为付费内容
您已阅读试读部分,购买后即可解锁全文。
⚠️ 本站内容已做唯一性标记并受版权保护,未经授权禁止转载,侵权必究。
还没有评论,来说两句?