我刚刚开始使用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 ... 有人能指出应该怎么做吗?
答案 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 t1
是t2
的子树。在这种情况下,使用可以使用isSubstring()
方法而不是equals()
。如果树t1
是t2
的子树而不是t1
的字符串,则表示t2
的子字符串。 isSubstring()
可以在O(log n)
时间内完成。
答案 2 :(得分:0)
您可以在两个树上进行顺序遍历,并检查两个遍历的结果是否相同。如果相同,我们可以假设两棵树都有相同的元素集。