版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/muzhixi/article/details/89328253
1. 分解为三个子问题,A包含B;A.left包含B;A.right包含B。
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1==null||root2==null) return false;
else{
boolean flag=false;
flag=treeContained(root1,root2);//A包含B?
if(flag) return flag;
flag=treeContained(root1.left,root2);//A.left包含B?
if(flag) return flag;
flag=treeContained(root1.right,root2);//A.right包含B?
return flag;
}
}
2.判断是否包含的函数可以单独写出,父辈结点都相等,并且当前B的结点为空,可以判断包含。
需要注意,这个函数中root2为null时直接返回true,并不是说B为null(前面HasSubtree已经排除了这种情况),而是判断到了B的叶子节点。
public boolean treeContained(TreeNode root1,TreeNode root2){
if(root2==null)return true;//判断到叶节点为null,返回true
else if((root1==null&&root2!=null)) return false;//root1为空,root2不为空,1一定不包含2;
else{
if(root1.val!=root2.val) return false;
else{
boolean flag=false;
flag=treeContained(root1.left,root2.left);
if(!flag) return false;
flag=treeContained(root1.right,root2.right);
return flag;
}
}
}