NC98:判断t1树中是否有与t2树拓扑结构
判断t1树中是否有与t2树拓扑结构完全相同的子树
http://www.nowcoder.com/questionTerminal/4eaccec5ee8f4fe8a4309463b807a542
方法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
名企高频面试算法题解 文章被收录于专栏
牛客题霸 - 程序员面试高频题 - 题解
查看1道真题和解析