【问题标题】:Binary search tree intersection二叉搜索树交集
【发布时间】:2015-08-14 22:15:53
【问题描述】:

我有 2 个二叉搜索树 T1 和 T2 具有相同数量的节点 n >= 1。对于每个节点 P,我们有 LEFT(P) 和 RIGHT(P) 用于节点之间的链接,KEY(P) 用于关闭节点。 T1 的根是 R1,T2 的根是 R2。 我需要一个 linear 算法来确定在 T1 和 T2 中都找到的值。

到目前为止,我的想法是对 T1 进行中序遍历并在 T2 中搜索当前元素,如下所示:

inorder(node)
   if node is not NULL
      inorder(LEFT(node))
      if find(KEY(node), R2)
            print KEY(node)
      inorder(RIGHT(node))

其中find(KEY(node), R2) 在树 T2 中实现对 KEY(node) 的二分查找。

这是正确的解决方案吗?这是线性算法吗? (我知道遍历是 O(n) 复杂度)。或者,还有另一种方法可以让两棵二叉搜索树相交?

谢谢!

【问题讨论】:

标签: algorithm tree binary-search-tree complexity-theory


【解决方案1】:

您当前的中序遍历使用递归来执行任务。这使得同时运行多个文件变得困难。

所以,首先我将重写方法以使用显式堆栈 (example here in C#)。现在,复制所有状态,以便我们同时执行 两棵 树的遍历。

在我们准备从两棵树中产生一个值的任何点上,我们比较它们的KEY() 值。如果它们不相等,那么我们继续遍历具有较低KEY() 值的树。

如果两个值 相等,则我们产生该值并继续再次遍历 两个树。

这在概念上类似于合并两个排序序列 - 我们需要做的就是检查每个序列要产生的“下一个”值,产生两个值中较低的值,然后在该序列中前进。


回答您最初的提议:

这是线性算法吗?

没有。对于您在中序遍历期间访问的每个节点,您调用的是find,即O(log n)。所以你的完整算法是(如果我没记错的话)O(n log n)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2021-11-27
    • 1970-01-01
    • 2010-10-26
    相关资源
    最近更新 更多