我想测试两个给定的BSTs
(二进制搜索树)在Java中是否相等。 BST
节点没有指向父节点的指针。
最简单的解决方案是遍历BSTs
,创建两个遍历列表并测试列表是否相等。但是它需要O(N)内存。
我想尝试另一种方法:创建Iterator
,遍历BSTs
,然后......其余的显而易见。
有意义吗?是否有任何“更好”(更简单和有效)的解决方案来测试两个BSTs
是否相等?
答案 0 :(得分:7)
二进制搜索树是一棵树,对吗?
如果两棵树具有相同的根和相同的孩子,则它们是相同的。
每个孩子也是一棵树。
见第2点。
提示:recursion。内存消耗为O(logn)
(自己证明)。
答案 1 :(得分:1)
最简单的方法是,创建两个树的哈希值,然后检查它们是否相等。这仅适用于两个树的内容相同的情况。
如何创建校验和,然后比较这些校验和。
http://www.mkyong.com/java/how-to-generate-a-file-checksum-value-in-java/
答案 2 :(得分:1)
实现递归equals()
方法。它不需要内存,并且很容易编码。
这样的事情应该有效:
public class Node {
Object value;
private Node left;
private Node right;
public boolean equals(Object o) {
if (o instanceof Node) {
Node node = (Node)o;
if (value.equals(node.value)) {
return true;
}
return ((left == null && node.left == null) || left.equals( node.left)) &&
((right == null && node.right == null) || right.equals( node.right));
}
return false;
}
}
请注意,您应该覆盖hashCode()
以反映此实现,因此请考虑将上述impl命名为equalsDeep()
并跳过hashCode()
impl。