在两个BST中查找公共节点的最佳方法是什么

时间:2015-05-26 08:45:12

标签: data-structures binary-search-tree

我在复杂性(空间和时间)方面寻找最佳选择。

我的方法直到现在是: 按顺序遍历一棵树,并为每个nodeId遍历第二棵树中的nodeId。

节点结构:

{{1}}

如果对这个问题有任何疑问,请告诉我。

3 个答案:

答案 0 :(得分:0)

假设一棵树长n而另一棵树长m,那么您的方法O(n*m)O(n+m),而您可以在location_1内完成。

让我们说你必须指出你在每棵树的位置(location_2location_1)。同时开始浏览两棵树,每次都决定你想要前进的指针。可以说nodeId = 4指的是location_2的节点,nodeId = 7的节点位于location_1。在这种情况下,$router.config ([ { path: '/account/profile', components: {'main' : 'accountProfile' }}, { path: '/campaigns/:type', components: {'main' : 'campaigns' }}, { path: '/login', components: {'main' : 'login' }}, { path: '/', redirectTo: '/home' } ]); 向前移动,因为它正在查看的节点之前的任何节点的值都小于4。

“向前移动”是指树的有序遍历。

答案 1 :(得分:0)

您可以在O(n + m)时间内使用标准合并执行此操作。一般算法是:

n1 = Tree1.Root
n2 = Tree2.Root
while (n1 != NULL && n2 != NULL)
{
    if (n1.Value == n2.Value)
    {
        // node exists in both trees. Advance to next node.
        n1 = GetInorderSuccessor(n1)
        n2 = GetInorderSuccessor(n2)
    }
    else if (n1.Value > n2.Value)
    {
        // n2 is not in Tree1
        n2 = GetInorderSuccessor(n2)
    }
    else
    {
        // n1 is smaller than n2
        // n1 is not in Tree2
        n1 = GetInorderSuccessor(n1)
    }
}
// At this point, you're at the end of one of the trees
// The other tree has nodes that are not in the other.
while (n1 != NULL)
{
    // n1 is not in Tree2. Output it.
    // and then get the next node.
    n1 = GetInorderSuccessor(n1)
}
while (n2 != NULL)
{
    // n2 is not in Tree1. Output it.
    // and then get the next node.
    n2 = GetInorderSuccessor(n2)
}

这里唯一困难的部分是GetInorderSuccessor电话。如果你用树做这个,那么你需要通过连续调用该函数来维持状态。您不能依赖标准的递归树遍历来为您完成。基本上,你需要一个树迭代器。

其他选项是首先遍历每个树以按顺序制作节点列表,然后将合并写入与这些列表一起工作。

答案 2 :(得分:0)

稍微修改过的Morris Traversal应该通过类似于合并排序的合并部分的移动来解决解决方案。时间复杂度:O(m + n),空间复杂度:O(1)。