使用标签重新排列树
Rearrange tree using labels
考虑一棵树(无序),其中节点标记为 0 到 n,根节点始终标记为 0。
我想构造一棵单独的树,其中每个非根节点m的父节点是其最近的标签小于m的祖先。
例如,给定这棵树:
要求的输出是:
注意节点 2 的标签比它的父节点 5 小,所以它向上移动了树;节点 4 小于它的父节点 7 和它的祖父节点 5,所以它向上移动树到它的曾祖父节点 0.
天真的方法是独立处理每个节点,向上遍历直到遇到较低的标签。对于以下情况,这变得非常昂贵:
感觉应该有一个相当简单的次二次算法来处理这样的重排,但我无法制定正确的组合,甚至找不到明显的遍历顺序来最小化冗余处理量。这是定义明确的解决方案的常见问题吗?
算法如下:
- 设置0为树的根
- 对原始树执行DFS。
- 执行递归注入。
递归注入(节点,父节点):
- 如果节点大于父节点,则作为父节点的子节点注入。
- 否则递归注入(节点,parent.parent)
考虑一棵树(无序),其中节点标记为 0 到 n,根节点始终标记为 0。
我想构造一棵单独的树,其中每个非根节点m的父节点是其最近的标签小于m的祖先。
例如,给定这棵树:
要求的输出是:
注意节点 2 的标签比它的父节点 5 小,所以它向上移动了树;节点 4 小于它的父节点 7 和它的祖父节点 5,所以它向上移动树到它的曾祖父节点 0.
天真的方法是独立处理每个节点,向上遍历直到遇到较低的标签。对于以下情况,这变得非常昂贵:
感觉应该有一个相当简单的次二次算法来处理这样的重排,但我无法制定正确的组合,甚至找不到明显的遍历顺序来最小化冗余处理量。这是定义明确的解决方案的常见问题吗?
算法如下:
- 设置0为树的根
- 对原始树执行DFS。
- 执行递归注入。
递归注入(节点,父节点):
- 如果节点大于父节点,则作为父节点的子节点注入。
- 否则递归注入(节点,parent.parent)