思路一:先序遍历
实际上就是树1的每个节点去和树2根节点匹配,根节点相同还得判断子树,根节点不同,那就找出树1节点中与树2根节点相同的节点,再进行子树判断
代码如下:
public class Solution {
boolean flag=false;
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root2==null||root1==null)
return false;
if(root1.val==root2.val)//根节点值相同,判断子树
flag=isSubTree(root1,root2);
if(!flag)//根节点值不同,判断树1左节点
flag=HasSubtree(root1.left,root2);
if(!flag)//根节点值不同,判断树1右节点
flag=HasSubtree(root1.right,root2);
return flag;
}
private boolean isSubTree(TreeNode root1,TreeNode root2)
{
if(root2==null)//树2先遍历完
return true;
if(root1==null)//树1先遍历完
return false;
if(root1.val!=root2.val)//遇到节点值不相等
return false;
//递归判断左右节点值是否都相同
return isSubTree(root1.left,root2.left) && isSubTree(root1.right,root2.right);
}
}
时间O(M*N) 空间树1的最大递归深度O(M)
M为树1节点,N为树二节点