题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
左边为A树,右边为B树
判断B树为A树的子结构
- 寻找A树中与B的根节点相同的节点
- 找到的A树中的节点左右节点是否包含B树的结构
//寻找相同的根节点
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
//两个树有一个为空时,返回false
if(root1 == null || root2 == null)
return false;
//当A树的节点值与B树根节点值相同时,调用IsContain判断结构是否相同
if(root1.val == root2.val && IsContain(root1,root2))
return true;
//搜索左孩子与右孩子
return HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2);
}
//判断是否包含
boolean IsContain(TreeNode root1,TreeNode root2) {
//如果A树此节点为空,B树此节点不为空,不包含
if(root1 == null && root2 != null)
return false;
//如果B树此节点为空 A树无论有无此节点都包含
if(root2 == null)
return true;
//比较左孩子与有孩子的值
return root1.val==root2.val
&& IsContain(root1.left,root2.left)
&&IsContain(root1.right,root2.right);
}