测试两棵二叉树是否相等的最有效方法
如何在Java中实现二叉树节点类和二叉树类以支持最有效的(从运行时角度来看)相等检查方法(也必须实现):
boolean equal(Node<T> root1, Node<T> root2) {}
或
boolean equal(Tree t1, Tree t2) {}
首先,我按如下方式创建了 Node 类:
public class Node<T> {
private Node<T> left;
private Node<T> right;
private T data;
// standard getters and setters
}
然后是将 2 个根节点作为参数并运行标准递归比较的 equals 方法:
public boolean equals(Node<T> root1, Node<T> root2) {
boolean rootEqual = false;
boolean lEqual = false;
boolean rEqual = false;
if (root1 != null && root2 != null) {
rootEqual = root1.getData().equals(root2.getData());
if (root1.getLeft()!=null && root2.getLeft() != null) {
// compare the left
lEqual = equals(root1.getLeft(), root2.getLeft());
}
else if (root1.getLeft() == null && root2.getLeft() == null) {
lEqual = true;
}
if (root1.getRight() != null && root2.getRight() != null) {
// compare the right
rEqual = equals(root1.getRight(), root2.getRight());
}
else if (root1.getRight() == null && root2.getRight() == null) {
rEqual = true;
}
return (rootEqual && lEqual && rEqual);
}
return false;
}
我的第二次尝试是使用数组和索引进行遍历来实现树。然后,可以在两个数组上使用按位运算(AND)进行比较 - 从2个数组读取块,并使用逻辑AND逐个掩码。我未能让我的代码正常工作,所以我不在这里发布(我很感激你对第二个想法的实现以及你的改进)。
有什么想法如何最有效地对二叉树进行相等性测试?
编辑
这个问题假设了结构性的平等。(不是语义相等)
但是,测试语义相等性的代码,例如“如果两个树的内容相同,即使它们的结构不是,我们是否应该认为它们相等?只是按顺序迭代树,它应该很简单。