二叉搜索树交叉点

时间:2015-06-01 12:40:49

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

我有2个二元搜索树T1和T2,节点数相同n> = 1.对于每个节点P,我们有LEFT(P)和RIGHT(P)用于节点之间的链接和KEY(P)用于关闭值节点。 T1的根是R1,T2的根是R2。 我需要一个 线性 算法,它将确定在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(节点)的二进制搜索。

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

谢谢!

1 个答案:

答案 0 :(得分:2)

您当前的inorder遍历使用递归来执行任务。这使得很难同时运行多个。

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

任何点,我们已准备好从两棵树中获取值,我们会比较它们的KEY()值。如果它们不等,那么我们继续遍历具有较低KEY()值的树。

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

这在概念上类似于合并两个排序的序列 - 我们需要做的就是检查" next"每个序列产生的值,产生两个值中较低的值,然后按该序列向前移动。

回答您的原始提案:

  

这是一种线性算法吗?

没有。对于您在顺序遍历期间访问的每个节点,您都在调用find O(log n)。所以你的完整算法是(如果我记得正确的复杂性)O(n log n)