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 对齐同一位置判断即可。

于是选定做法:递归 + 同步遍历。每一步只处理当前这一对节点,其余交给递归,结构最贴合定义。

解法

把「当前这一对节点是否相同」拆成四种情况,按顺序判断:

  1. 两个都空 → 两侧都走到底且结构一致,返回 true。
  2. 一个空、一个非空 → 结构不同,返回 false。
  3. 两个都非空但值不同 → 返回 false。
  4. 值相同 → 递归比较 左对左、右对右,两边都为真才返回 true。
当前 p当前 q判断结果
空空都到底true
空非空结构不同false
非空空结构不同false
非空非空但值不同值不同false
非空非空且值相同继续比左右子树左子树相同 && 右子树相同

下图把上面 4 个步骤串成流程,并逐步演示:

100. 相同的树(简单) 解法步骤流程图
图① 解法步骤流程图(共 4 步)。
100. 相同的树(简单) 按步骤逐步执行的动画
动图② 按步骤依次推

🔒

本篇为付费内容

您已阅读试读部分,购买后即可解锁全文。

⚠️ 本站内容已做唯一性标记并受版权保护,未经授权禁止转载,侵权必究。