题目描述
输入两棵二叉树 A 和 B,判断 B 是不是 A 的子结构。(约定空树不是任意一个树的子结构)
B 是 A 的子结构, 即 A 中有出现和 B 相同的结构和节点值。
例如:
给定的树 A:
3
/ \
4 5
/ \
1 2
给定的树 B:
4
/
1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
LeetCode:树的子结构
解题思路
第一步:在树 A 中找到和树B的根节点的值一样的节点R(A.val == B.val);进行第二步
第二步:判断树 A 中以 R 为根节点的子树是不是包含和树 B 一样的结构函数 DoesTree1HaveTree2() 的功能。
此处可以理解为将树B原封不动的拿过来;将 B 的根节点放在R位置处,看看树B的所有枝叶是否能恰好覆盖 R 的部分枝叶(恰好的概念为:对于R和B的同一深度的节点,R 和 B 有相同的左右子节点)
代码
// 第一步:在树 A 中找到和树 B 的根节点的值一样的节点R(A.val == B.val);进行第二步
// 第二步:判断树 A 中以 R 为根节点的子树是不是包含和树 B 一样的结构函数
// DoesTree1HaveTree2() 的功能,即将树 B 原封不动的拿过来;将 B 的根节点放在R位置处,
// 看看树 B 的所有枝叶是否能恰好覆盖 R 的部分枝叶
//(恰好的概念为:对于 R 和 B 的同一深度的节点,R 和 B 有相同的左右子节点)
public boolean isSubStructure(TreeNode A, TreeNode B) {
boolean result = false;
if (A != null && B != null) {
// 如果根节点值相等,判断 A 中是否含有 B
if (A.val == B.val)
result = DoesTree1HaveTree2(A, B);
if (!result)
result = isSubStructure(A.left, B);
if (!result)
result = isSubStructure(A.right, B);
}
return result;
}
// DoesTree1HaveTree2 比较的是以 R 开始的树是否包含 B (此时判断 R 和 B 的左右子节点是否一致);
// 终止条件为到达了树 R 或树 B 的叶节点
private boolean DoesTree1HaveTree2(TreeNode R, TreeNode B) {
if (B == null)
return true;
if (R == null)
return false;
if (R.val != B.val)
return false;
// 比较 R 与 B 的左右枝叶是否相等
return DoesTree1HaveTree2(R.left, B.left)
&& DoesTree1HaveTree2(R.right, B.right);
}