方法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