思路:判断root1是否包含root2,则从大树根节点开始遍历,与小树的根节点比较,如果相等则继续往大树和小树的左右子节点进行判断,如果有符合的部分这就是包含了子结构。
/**
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) {
boolean result=false;
//如果root1和root2都!=null才进行判断
if(root1!=null&&root2!=null){
//如果根节点值相同,则往下判断
if(root1.val==root2.val){
result=isSubtree(root1,root2);
}
//如果找不到,以root1的左子节点去判断是否包含root2
if(!result){
result=HasSubtree(root1.left,root2);
}
//以右子节点判断是否包含root2
if(!result){
result=HasSubtree(root1.right,root2);
}
}
return result;
}
//判断子节点方法
public static boolean isSubtree(TreeNode node1,TreeNode node2){
//第一轮都会进行到最后一行代码,因为val相等
//如果小的树root2遍历完了,则返回true,
//因为上一次循环,根节点是相同的,root2结束了说明是被root1包含
if(node2==null) return true;
//如果大的树root1遍历完了,小树root1还没遍历完,则返回false
if(node1==null) return false;
//如果有子节点值不同,则返回false
if(node1.val!=node2.val) return false;
//最后判断左边子节点和右边子节点
return isSubtree(node1.left,node2.left)&&isSubtree(node1.right,node2.right);
}
}