public class E26Subtree {
private class BinaryTreeNode{
double value;
BinaryTreeNode leftNode;
BinaryTreeNode rightNode;
}
public static boolean hasSubtree(BinaryTreeNode root1, BinaryTreeNode root2){
boolean result = false;
if (root1 != null && root2 != null){
if (doubleEqual(root1.value, root2.value))
result = hasSubtreeCore(root1, root2);
if (!result)
result = hasSubtreeCore(root1.leftNode, root2);
if (!result)
result = hasSubtreeCore(root1.rightNode, root2);
}
return result;
}
private static boolean hasSubtreeCore(BinaryTreeNode root1, BinaryTreeNode root2){
if (root2 == null)
return true;
if (root1 == null)
return false;
if (!doubleEqual(root1.value, root2.value))
return false;
return hasSubtreeCore(root1.leftNode, root2.leftNode) &&
hasSubtreeCore(root1.rightNode, root2.rightNode);
}
private static boolean doubleEqual(double a, double b){
return (a - b) > -0.0000001 && (a - b) < 0.0000001;
}
public static void main(String[] args){
}
}