使用标签重新排列树

时间:2017-04-11 11:46:23

标签: algorithm tree tree-traversal

考虑一个树(无序),其中节点标记为0到n,根节点始终标记为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 个答案:

答案 0 :(得分:1)

算法将如下:

  1. 将0设置为树的根
  2. 在原始树上执行DFS。
  3. 执行递归注入。
  4. 递归注入(node,parent):

    1. 如果节点大于父节点,则注入父节点的子节点。
    2. 否则递归注入(node,parent.parent)