Leetcode 572 Subtree of Another Tree 题解分析

💡 原文中文,约1900字,阅读约需5分钟。
📝

内容提要

LeetCode 572题要求判断subRoot是否为root的子树,子树需结构与节点值完全相同。解法采用双重递归:先在root中查找与subRoot根节点值相同的节点,再递归比较两棵树是否完全一致,任一子树匹配即返回true。

🔎

延伸解读

子树与子结构的关键区别

本题要求判断的是子树,而非子结构。子树必须包含某个节点及其所有后代,且结构与节点值完全一致。示例2中,root的子树[4,1,2]下多了一个0节点,因此不是完全相同的子树,输出false。理解这一区别是解题的关键,避免误将部分匹配当作子树。

双重递归的解题思路

解法采用双重递归:外层递归遍历root,寻找与subRoot根节点值相同的节点;一旦找到,就调用内层递归isSameTree比较两棵树是否完全相同。外层递归使用或运算,只要在左子树或右子树中找到匹配即可返回true。这种分治策略清晰地将查找与比较分离。

边界条件与递归终止

代码中处理了多种边界情况:当subRoot或root为null时直接返回false;在isSameTree中,两个节点均为空视为相同,一个为空则返回false。这些判断确保了递归正确终止,并覆盖了树结构不一致的情形。注意,isSameTree要求结构和值完全一致,任何差异都会导致false。

❓

Q&A

LeetCode 572 题要求判断什么?

给定两棵二叉树 root 和 subRoot,判断 root 中是否存在一棵子树,其结构与节点值完全等同于 subRoot。子树由 root 中的某个节点及其所有后代组成,root 本身也可视为自己的子树。

为什么示例2中 root = [3,4,5,1,2,null,null,null,null,0] 和 subRoot = [4,1,2] 的结果是 false?

因为 root 中值为 4 的节点左子树包含额外的节点 0,导致结构与 subRoot 不完全相同。题目要求子树必须与 subRoot 结构和节点值完全一致,不能有多余节点,因此返回 false。

解决 LeetCode 572 题的核心思路是什么?

采用双重递归:首先在 root 中递归查找与 subRoot 根节点值相同的节点;找到后,再递归比较以该节点为根的子树与 subRoot 是否完全相同。只要在 root 的任意子树中找到匹配,就返回 true。

isSubtree 方法中,当 root 和 subRoot 根节点值相同时会做什么?

会调用 isSameTree 方法递归比较 root 和 subRoot 的左右子树是否完全一致。如果 isSameTree 返回 true,则 isSubtree 直接返回 true;否则继续在 root 的左右子树中递归查找。

isSameTree 方法如何判断两棵树是否完全相同?

递归比较:若两个节点都为空,返回 true;若一个为空另一个不为空,返回 false;若节点值不同,返回 false;否则递归比较左右子树,只有左右子树都相同才返回 true。

在 isSubtree 方法中,如果 root 节点值与 subRoot 节点值不同,下一步怎么做?

会递归调用 isSubtree 分别在 root 的左子树和右子树中查找与 subRoot 匹配的子树,使用逻辑或(||)连接,只要任意一边找到就返回 true。

🏷️

标签

➡️

继续阅读