/**
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 res=false;
if (root1!=null&&root2!=null){
if (root1.val==root2.val){
//从root1的根节点开始
res= dosearch(root1,root2);
}
if (!res){
//如果从根节点出发还没找到,则从root1的左结点开始递归寻找
res=HasSubtree(root1.left,root2);
}
if (!res){
//如果从根节点出发还没找到,则从root1的右结点开始递归寻找
res=HasSubtree(root1.right,root2);
}
}
return res;
}
private boolean dosearch(TreeNode root1, TreeNode root2) {
//注意这个判断的顺序不能乱
if (root2==null){
//root2为null,说明之前的都匹配上了返回true
return true;
}
if (root1==null){
//root1为null而root2不为null,说明还没匹配完成,root2不是root1的子树,返回false
return false;
}
if (root1.val!=root2.val){
//不等于就返回false
return false;
}
//递归去比较左右节点
return dosearch(root1.left, root2.left)&&dosearch(root1.right,root2.right);
}
}
这个算法巧妙地利用了两次递归,一层一层的去遍历节点。