二叉树到一般树

时间:2012-10-20 15:10:05

标签: data-structures

我知道从一般树中你可以构造一个唯一的二叉树,但是反过来呢?即你能从二叉树中得到一个唯一的通用树吗?

2 个答案:

答案 0 :(得分:2)

是。以下转变是可逆的:

给定一个包含有序但未编入索引子项的常规树, 将第一个子节点编码为其父节点的左子节点,将每个其他节点编码为其(前)兄弟节点的右子节点。

相反的是: 给定带有区分左右儿童的二叉树,将节点的左子节点作为其第一个子节点,将右子节点作为其下一个兄弟节点。

所以,以下树

  a
 /|\
b c d

编码为

  a
 /
b
 \
  c
   \
    d

而下面的树

   a
  / \
 b   c
 |
 d

编码为

     a
    /
   b
  / \
 d   c

(阅读:db的第一个孩子,ca的兄弟。

请注意,您可以通过为根指定兄弟来对任何有根森林(具有有序组件,否则表示不唯一)进行编码,因此

  a
 / \
b   c
 \   \
  d   e

将被视为

  a   c e
 / \
b   d

这是另一个方法,用于从二叉树中获取唯一的通用(无向)树

  • 顶点二叉树可能有0 ... 3个图形邻居。
  • 将12个节点附加到根
  • 向每个左子女附加8个节点
  • 为每个右边的孩子添加4个节点

此操作是可逆的:

  • 标记具有至少12个邻居“root”的节点。如果不是唯一的,则失败。
  • 用8..11个邻居“left”标记每个节点。
  • 用4..7个邻居“右”标记每个节点。
  • 删除所有树叶
  • 使所有边缘远离根
  • 如果任何节点有多个左子女或多个右子,则失败。

所以,

  • 有序的有根树和二叉树之间存在双射(第一和第二算法)。
  • 由于任何一般树都可以任意植根,因此从一般(有向或无向)树到二叉树注入。
  • 从二叉树到一般无向树的注入(第三算法)
  • 由于存在从二叉树到一般树木和背面的注入,一般(有向或无向)树和二叉树之间必须存在双射。

答案 1 :(得分:1)

我觉得不太可能。通常,二叉树区分左小孩和右小孩。但是,一般树木没有。

我们如何从这两个二叉树中获得唯一的通用树。

  X      X
 / \    / \
 Y Z    Z Y

这两个怎么样?

  X      X
 /        \
 Y        Y

另一方面,

如果您选择不区分二叉树的左子或右子,或者选择尊重子项出现在一般树中的序列,只需将每个二叉树映射到自身。这将是每个二叉树的唯一通用树。