链接
牛客:树的子结构
LeetCode:剑指 Offer 26. 树的子结构
题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结点)
思路
要满足B是A的子结点,最起码先保证B的根结点和A中某个子树相同,这样可以分为三种情况
- B的根结点和A的根结点相同
- B的根结点和A的左子树某个结点相同
- B的根结点和A的右子树某个结点相同
我们还需要写一个函数用于当B根结点已经在A中找到了 判断B是否存在于A中。
代码
public class Solution {
public boolean HasSubtree(TreeNode root1, TreeNode root2) {
if (root1 == null || root2 == null)
return false;
if (root1.val == root2.val) {
return HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2) || IsSubtree(root1, root2);
}
return false;
}
public boolean IsSubtree(TreeNode root1, TreeNode root2) {
if (root2 == null)
return true;
if (root1 == null)
return false;
if (root1.val == root2.val) {
return IsSubtree(root1.left, root2.left) && IsSubtree(root1.right, root2.right);
}
return false;
}
}
扩展
这道题还可以扩展:572. 另一个树的子树
两道题的区别在于剑指offer上的那题子树可以是不完整的,但是这一题子树是完整的。
class Solution {
public boolean isSubtree(TreeNode s, TreeNode t) {
if (s == null || t == null) {
return false;
}
return check(s, t) || isSubtree(s.left, t) || isSubtree(s.right, t);
}
public boolean check(TreeNode s, TreeNode t) {
if (s == null && t == null) {
return true;
}
if (s == null || t == null || s.val != t.val) {
return false;
}
return check(s.left, t.left) && check(s.right, t.right);
}
}