方法1:递归
时间复杂度:O ( M ∗ N )
当root1什么都没有的时候,在root1里面找不到任何节点直接返回false。
当root2提前终止了,此时还没有遇到不符合root1树的节点,直接返回true。
public boolean isContains (TreeNode root1, TreeNode root2) {
// write code here
if(root1==null){
return false;
}
return isContains(root1.left,root2) || isContains(root1.right,root2) || isSubTree(root1,root2);
}
public boolean isSubTree(TreeNode root1,TreeNode root2){
if(root1==null && root2==null){
return true;
}
if(root1==null || root2==null || root1.val!=root2.val){
return false;
}
return isSubTree(root1.left,root2.left) && isSubTree(root1.right,root2.right);
}方法2:中序遍历+strings.contains()
将二叉树中序遍历之后,如果t2的序列化结果能在t1中找到能说明t2是t1的子树(KMP算法),当然这里直接调用 strings.contains()判断也是可以,反而性能更好一点
public boolean isContains (TreeNode root1, TreeNode root2) {
// write code here
StringBuffer res1=new StringBuffer();
StringBuffer res2=new StringBuffer();
preOrder(root1,res1);
preOrder(root2,res2);
if(res1.toString().contains(res2.toString())){
return true;
}
else{
return false;
}
}
public void preOrder(TreeNode root,StringBuffer res){
if(root==null){
return;
}
preOrder(root.left,res);
res.append(root.val);
preOrder(root.right,res);
}方法3:序列化(中序)+KMP

京公网安备 11010502036488号