输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
首先要明白在java中用TreeNode来表示数结构
//树的结构:
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) {
//首先判断当前节点是否为空:如果root1本身或者root2为空,那么就不存在子结构这样的说法了
if(root1==null||root2==null){
return false;
}
//首先对根节点进行判断,如果从根节点就匹配到了,那么就可以不进行下面的代码了,
//因此可以使用短路的结构,如果第一个条件满足,那么就直接退出,如果第一个条件不满足,接着进行
//第二个条件,如果第二个条件满足,就不用进行第三个条件的判断,如果第二个条件不满足才进行第三个
//条件的判断。
return judge(root1,root2)||judge(root1.left,root2)||judge(root1.right,root2);
//再解释一下首先拿两个根节点进行比较,如果匹配到了,返回了true,就直接退出了。如果返回了false,就拿root1节点的左节点跟root2比较,如果发现root1
//的左孩子节点的跟root2匹配上了,返回true,就不用再进行下一个判断了。否则,还有看看root1的右孩子节点跟root2的匹配情况。
}
public boolean judge(TreeNode t1,TreeNode t2){
//前面的两个if也可以理解为递归的结束条件。
if(t2==null){
//这句话的意思是如果t2为空,说明遍历完成了,也就是所谓的找到了子树
return true;
}
if(t1==null){
//这句话的意思代表,t2还没为空,而主数已经为空了,那么说明主树还没有
//子树长,那么可以直接退出。
return false;
}
//对t1与t2进行值的判断
if(t1.val==t2.val){
//相等
//判断节点的左节点与子树的左节点是否相同,不相同直接短路退出,
//返回false,如果相同再判断该节点的右节点是否跟子树节点的右节点是否相同.
return judge(t1.left,t2.left)&&judge(t1.right,t2.right);
}
else{
//不相等
return false;
}
}
}