测试两个BST在Java中是否相等

时间:2012-07-16 07:01:11

标签: java equality binary-search-tree

我想测试两个给定的BSTs(二进制搜索树)在Java中是否相等。 BST节点没有指向父节点的指针。

最简单的解决方案是遍历BSTs,创建两个遍历列表并测试列表是否相等。但是它需要O(N)内存。

我想尝试另一种方法:创建Iterator,遍历BSTs,然后......其余的显而易见。

有意义吗?是否有任何“更好”(更简单和有效)的解决方案来测试两个BSTs是否相等?

3 个答案:

答案 0 :(得分:7)

  1. 二进制搜索树是一棵树,对吗?

  2. 如果两棵树具有相同的根和相同的孩子,则它们是相同的。

  3. 每个孩子也是一棵树。

  4. 见第2点。

  5. 提示:。内存消耗为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。