【发布时间】:2012-03-24 17:27:47
【问题描述】:
你将如何在 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
}
然后是接受两个根节点作为参数并运行标准递归比较的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 一个一个地屏蔽。我没有让我的代码正常工作,所以我不在这里发布(我很感激你对第二个想法的实现以及你的改进)。
任何想法如何最有效地对二叉树进行相等性测试?
编辑
问题假设结构平等。 (不是语义平等)
但是,测试语义相等性的代码,例如“如果它们的内容相同,即使它们的结构不同,我们是否应该认为两棵树是相等的?”将只是按顺序迭代树,它应该很简单。
【问题讨论】:
-
“我们应该考虑...”暗示了主观意见,并且使 SO 不适合这些问题 [可能被关闭为“不具建设性”]。您应该定义它是哪一个:您所追求的结构平等或语义平等。 [至少国际海事组织]
标签: java algorithm data-structures binary-tree