2017-04-11 49 views
1

考虑一个树(无序的),其中所述节点通过n个标记为0,与始终标记为0重新排列用树标签

我希望构造一个单独的树,根节点,其中,每个非父 - 根节点m是其最近的祖先,标签小于m。

例如,给定此树:

(0 (1 (3)) (5 (7 (9 4) 2 (6))) 8)

所需的输出是:

(0 (1 (3) 5 (7 (9))) 4 2 (6) 8)

注意,节点2具有比其父5在较小的标签,所以其移动在树上;节点4比它的父亲7和它的祖父母5少,因此它向上移动到它的祖辈0。

幼稚的方法是独立处理每个节点,遍历向上,直到遇到较低的标签。这将成为如情况非常昂贵:

(0 (n (n-1 ... (2 (1)))))

感觉就像应该有处理这种重新安排一个相当简单的子二次算法,但我不能制定正确的药汁,甚至找到一个明显的遍历顺序可以最大限度地减少冗余处理的数量。这是一个定义明确的解决方案的常见问题吗?

回答

1

该算法将是以下:

  1. 设定0作为树的根
  2. 原始树执行DFS。
  3. 执行递归注入。

递归注入(节点,父):

  1. 如果节点比亲本大,注入作为母体的孩子。
  2. 否则递归注入(node,parent.parent)
+1

啊是的那就是那个!直截了当,看到它的作用微不足道。 也容易制作递归的迭代版本。 谢谢@xenteros。 – MorT

+1

@MorT没有必要用迭代算法替换递归。您可以拥有相同的性能和更清晰的代码。顺便说一句,在[所以]我们upvote有用的答案,并addaly接受最好的一个:) – xenteros

+0

唉,这里提出的问题是一个大型系统的广泛修剪版。实际的实现不提供关于树深度的任何保证,并且嵌入不适用于尾递归。 感谢您的礼仪小费;) – MorT