您将如何在Java中实现二叉树节点类和二叉树类以支持最有效(从运行时角度)相等的检查方法(也必须实现):
boolean equal(Node root1, Node root2) {}
要么
boolean equal(Tree t1, Tree t2) {}
首先,我创建了Node类,如下所示:
public class Node {
private Node left;
private Node right;
private T data;
// standard getters and setters
}
然后使用等于2个根节点作为参数并运行标准递归比较的equals方法:
public boolean equals(Node root1, Node 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对其进行掩码。我没有让我的代码工作,所以我不会在这里发布(我会感谢你的第二个想法的实现以及你的改进)。
任何想法如何最有效地进行二叉树的平等检验?
编辑
这个问题假定结构平等。 (不是语义上的平等)
然而,测试语义相似性的代码例如“如果它们的内容相同,我们应该考虑两棵树是相等的,即使它们的结构不是吗?”只是按顺序迭代树,它应该是直接的。