输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构)
假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构
思路:递归的思想
1.先遍历树pRoot1,如果遍历到和pRoot2节点值相同的节点,进入isSubTree方法判断接下来的节点是否都相同
2.节点都相同返回True;不相同返回False,并且继续遍历树pRoot1找下一个相同的节点
3.如果遍历完了pRoot1还没有返回过True,说明pRoot2不是pRoot1的子结构,返回False
isSubTree方法:用于判断从pRoot1的子树是否有和pRoot2相同的部分
1.采用递归的思想,如果节点root1与root2的节点不同,则说明pRoot1的子树与pRoot2不具有相同的节点
2.如果值相同,则递归判断(isSubTree)他们各自得左右节点的值是不是相同
3.递归的终止条件时到达pRoot1或pRoot2的叶节点
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root2==null){
return false;
}
if(root1==null&&root2!=null){
return false;
}
boolean flag = false;
if(root1.val==root2.val){
flag = isSubTree(root1,root2);
}
if(!flag){
flag = HasSubtree(root1.left,root2);
if(!flag){
flag = HasSubtree(root1.right,root2);
}
}
return flag;
}
private boolean isSubTree(TreeNode root1,TreeNode root2){
if(root2==null){
return true;
}
if(root1==null&&root2!=null){
return false;
}
if(root1.val==root2.val){
return isSubTree(root1.left,root2.left)&&isSubTree(root1.right,root2.right);
}else{
return false;
}
}
}