Open songyy5517 opened 1 year ago
思路: 遍历 & 递归比较左右子树
boolean isSubTree(A, B)
:判断以A为根节点的子树是否包含以B为根节点的子树
复杂度分析:
isSubTree
,对二叉树B中的各个节点进行比较,需要 $O(N)$ ,因此总时间复杂度为 $O(MN)$ 。/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSubStructure(TreeNode A, TreeNode B) {
// 1. 特殊值处理/递归出口
if (A == null || B == null)
return false;
// 2. 递归判断:遍历树A,比较A当前节点和B根节点
boolean res = false;
// 2.1 若两节点值相等,则判断B树是否在以该节点为根节点的子树中 (isSubTree)
if (A.val == B.val){
res = isSubTree(A, B);
}
// 2.2 若不相等,则继续遍历A的剩余节点
// 此处不能else,因为之后的遍历过程中,还可能会出现与B节点值相同的节点 (2023/2/13)
if (!res)
return isSubStructure(A.left, B) || isSubStructure(A.right, B);
return res;
}
// 作用:递归判断以B为根节点的树是否为以A为根节点树的子结构
public static boolean isSubTree(TreeNode A, TreeNode B){
// 递归出口
if (B == null)
return true;
if (A == null) // 此时A为空,B不为空,说明匹配失败(2023/2/13)
return false;
if (A.val == B.val)
return isSubTree(A.left, B.left) && isSubTree(A.right, B.right); // 这里是&&,两个条件必须同时满足
else
return false;
}
}
2023/2/13
2024/1/22
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
例如: 给定的树 A:
给定的树 B:
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
示例 1:
示例 2:
分析 这道题需要我们判断树B是否为树B的子结构。一个很直接的想法是,先遍历树A,找到与树B根节点值相同的节点,然后依次比较两棵子树是否相等。其中关键点是如何比较子树。 我们可以定义一个Boolean类型的递归方法,判断节点A和节点B所在子树是否匹配。若两个节点值相等,则继续对其左右子树进行递归判断。