对于两棵彼此独立的二叉树A和B,请编写一个高效算法,检查A中是否存在一棵子树与B树的拓扑结构完全相同。
给定两棵二叉树的头结点A和B,请返回一个bool值,代表A中是否存在一棵同构于B的子树。
普通解法为二叉树遍历+匹配问题,考察tree1中每个节点为头的子树是否与tree2一致,时间复杂度为O(N*M)
N:tree1节点数 M:tree2节点数
最优解法为 二叉树序列化 + KMP算法 时间复杂度为O(N+M):将tree1和tree2都序列化成字符串str1,str2,然后看str1中是否包含str2,是一个字符串匹配问题。用KMP算法即可,代码如下:
public class IdenticalTree {
public boolean chkIdentical(TreeNode A, TreeNode B) {
// write code hereif(B==null)
return false;
if(A==null&&B!=null)
return false;
String a_str = TreeToString(A);
String b_str = TreeToString(B);
return (a_str.indexOf(b_str)==-1)?false:true;
}
public String TreeToString(TreeNode tree){
String str;
if(tree == null)
return "# ";
str = tree.val + " " + TreeToString(tree.left) + " " + TreeToString(tree.right);
return str;
}
}