我有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个二叉搜索树?
谢谢!
答案 0 :(得分:2)
您当前的inorder遍历使用递归来执行任务。这使得很难同时运行多个。
所以,首先我会重新编写方法以使用显式堆栈(example here in C#)。现在,复制所有状态,以便我们同时执行两个树的遍历。
在任何点,我们已准备好从两棵树中获取值,我们会比较它们的KEY()
值。如果它们不等,那么我们继续遍历具有较低KEY()
值的树。
如果两个值 相等,那么我们产生该值并继续遍历两个树。
这在概念上类似于合并两个排序的序列 - 我们需要做的就是检查" next"每个序列产生的值,产生两个值中较低的值,然后按该序列向前移动。
回答您的原始提案:
这是一种线性算法吗?
没有。对于您在顺序遍历期间访问的每个节点,您都在调用find
O(log n)
。所以你的完整算法是(如果我记得正确的复杂性)O(n log n)
。