测试两个二叉搜索树是否具有相同的元素集?

时间:2013-04-24 12:54:27

标签: java binary-search-tree

我刚刚开始使用java和递归方法,我需要一些帮助: 我需要确定两个二进制搜索树是否具有完全相同的元素集,而不管树的结构如何。

我编写了一个方法来检查树是否包含一个元素,并调用它包含()

这是我到目前为止所得到的:

    public boolean sameContents(Node n2) {

    if (contains(n2, n2.key) && n2.left == null && n2.right == null) { return true; }
    if (contains(n2, n2.key) && n2.left != null) { sameContents(n2.left); }
    if (contains(n2, n2.key) && n2.right != null) { sameContents(n2.right); }
     return false; 
   }

基本上我的想法是,只要节点仍然有子节点,并且树匹配,该方法就会运行。 我用例如testTree1.sameContents(testTree2)调用该方法;但该方法总是返回false ... 有人能指出应该怎么做吗?

3 个答案:

答案 0 :(得分:1)

执行此操作的最佳方法是使用Iterator对象 - 如果两个二叉搜索树包含相同的元素,则其迭代器的next方法应返回相同的值(即使它们的结构不同)。

// returns true if the trees are equivalent, else false
Iterator itr1 = tree1.getIterator();
Iterator itr2 = tree2.getIterator();
while(itr1.hasNext() && itr2.hasNext()) {
    if(!itr1.next().equals(itr2.next())) {
        return false;
    }
}
return !itr1.hasNext() && !itr2.hasNext(); // returns true if trees were the same size, else false

你应该已经有了一个inorder二进制树遍历方法,所以你已经有了一个Iterator - 只需添加一个ArrayList / Stack来代替调用堆栈,这样就可以暂停遍历(无论何时你都可以进行递归方法调用,将当前节点存储到堆栈中

答案 1 :(得分:1)

还有另一种方法可以做到这一点。您可以使用预先遍历或按顺序遍历将树转换为字符串表示形式。这需要O(n)次。比你可以检查这些字符串是否相等。它也可以在O(n)时间内完成。因此,总运行时间为O(n)

此方法看起来类似于使用迭代器的解决方案,但是这个方法更通用,因为可以用于'is-subtree'任务(chechs wether tree t1t2的子树。在这种情况下,使用可以使用isSubstring()方法而不是equals()。如果树t1t2的子树而不是t1的字符串,则表示t2的子字符串。 isSubstring()可以在O(log n)时间内完成。

答案 2 :(得分:0)

您可以在两个树上进行顺序遍历,并检查两个遍历的结果是否相同。如果相同,我们可以假设两棵树都有相同的元素集。