你如何在Java中实现二叉树节点类和二叉树类以支持最有效(从运行时间的角度)的等式检查方法(也必须实现):
我的第二次尝试是使用数组和索引来实现树的遍历。然后,可以使用按位操作(AND)在两个数组上进行比较 - 从2个数组中读取块,并使用逻辑AND将一个掩码到另一个数组上。我未能使代码正常工作,因此我不会在这里发布它(如果您能实现第二个想法并进行改进,我将不胜感激)。
有什么想法可以最有效地进行二叉树的相等测试吗?
编辑
该问题假定结构相等。(而非语义相等)
然而,测试语义相等的代码,例如“如果两个树的内容相同,即使它们的结构不同,我们是否应该认为这两个树相等?”只需按顺序迭代树,这应该很简单。
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
}
然后是接收两个根节点作为参数并运行标准递归比较的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将一个掩码到另一个数组上。我未能使代码正常工作,因此我不会在这里发布它(如果您能实现第二个想法并进行改进,我将不胜感激)。
有什么想法可以最有效地进行二叉树的相等测试吗?
编辑
该问题假定结构相等。(而非语义相等)
然而,测试语义相等的代码,例如“如果两个树的内容相同,即使它们的结构不同,我们是否应该认为这两个树相等?”只需按顺序迭代树,这应该很简单。