algorithm - 使用标签重新排列树

标签 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为一棵树的根
  2. 对原始树执行 DFS。
  3. 执行递归注入(inject)。

递归注入(inject)(节点,父节点):

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

关于algorithm - 使用标签重新排列树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43345012/

相关文章:

c++ - 二叉搜索树删除而不复制

php - 如何从此结果集创建一个数组(嵌套类别存储在具有遍历模型的数据库中)?

algorithm - 后序图遍历?

sqlite - 查询 SQLite 树结构

c++ - 如何在数组上执行环绕遍历?

algorithm - 遍历所有给定节点的最快路径

performance - 对数组元素进行排序的最高效算法是什么?

tree - 绘制树木和图形的最佳技术是什么?

java - 打印二叉树的层序遍历,从左到右和从右到左交替

algorithm - 确定流中的所有字节是否相等