我在复杂性(空间和时间)方面寻找最佳选择。
我的方法直到现在是: 按顺序遍历一棵树,并为每个nodeId遍历第二棵树中的nodeId。
节点结构:
{{1}}
如果对这个问题有任何疑问,请告诉我。
答案 0 :(得分:0)
假设一棵树长n
而另一棵树长m
,那么您的方法O(n*m)
长O(n+m)
,而您可以在location_1
内完成。
让我们说你必须指出你在每棵树的位置(location_2
和location_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)。