在树结构中,找到根节点和k个节点之间的最高密钥

时间:2012-10-25 20:25:20

标签: algorithm tree

需要定义一个seek(u,v)函数,其中u是树中的新节点(我想要开始搜索的节点),v是新节点下面的后代数,而这个函数将返回最高键值的索引。树没有BST,可能有许多子节点。例如:

input:
5             // tree with 5 nodes
1 3 5 2 7     // the nodes' keys
1 2           // 1 and 2 are linked
2 3           // 2 and 3 are linked
1 4           // 1 and 4 are linked
3 5           // 3 and 5 are linked
4             // # of seek() requests
2 3           // index 2 of tree, which would be key 5, 3 descendants from index 3 
4 1           // index 4 of tree, but only return highest from index 4 to 4 (it would 
              // return itself)
3 2           // index 3, next 2 descendants
3 2           // same

output:
5             // Returned index 5 because the 7 is the highest key from array[3 'til 5]
4             // Returned index 4 because the range is one, plus 4's children are null
5             // Returned index 5 because the 7 is the highest key from array[4 'til 5]
5             // Same as prior line

我正在考虑将新根放入新的红黑树,但无法找到有效保存每个节点的后继或前任信息的方法。还考虑放入一个数组,但由于不平衡和未排序的树的性质,它不能保证我的树将被排序,加上因为它不是BST我不能执行顺序树步行。有关如何从特定范围获取最高密钥的任何建议吗?

1 个答案:

答案 0 :(得分:1)

我不太清楚你的意思是:“新节点下面的后代数”。你说它的方式,它意味着有某种强加的树步行,或者至少是你必须访问节点的顺序。在这种情况下,最好更全面地解释一下你的意思。

在答案的其余部分,我假设你的意思是与你的距离。

从纯粹的算法角度来看,由于你无法假设你的树,你必须访问图形的所有相关顶点(即远距离的顶点< = v)以获得结果。这意味着任何部分树遍历(例如深度优先或广度优先)应该足够且必要(因为您必须访问u下面的所有相关节点),因为我们访问节点的顺序无关紧要。 / p>

如果可以的话,使用递归函数seek'(u,v)更简单,它返回一对(索引,键)定义如下:

  • 如果v> 1,你将seek'(u,v)定义为在夫妻(u,key(u))中最大化其第二个成分的夫妻,并为你的儿子寻找(w,v-1)。
  • else(v = 1)你将seek'(u,v)定义为(u,key(u))

然后你寻求(u,v)= first(寻找'(u,v))。

我所说的所有内容都假设您已经根据输入构建了一个树,或者您可以轻松地从索引中获取节点及其子节点的密钥。