Data structures 二叉树到一般树
我知道,从一棵普通树上,你可以构造一棵唯一的二叉树,但反过来是真的吗?i、 你能从二叉树中得到一个独特的通用树吗?我觉得不太可能。通常,二叉树区分左子树和右子树。然而,一般的树却没有 我们应该如何从这两个二叉树中得到一个唯一的通用树呢Data structures 二叉树到一般树,data-structures,Data Structures,我知道,从一棵普通树上,你可以构造一棵唯一的二叉树,但反过来是真的吗?i、 你能从二叉树中得到一个独特的通用树吗?我觉得不太可能。通常,二叉树区分左子树和右子树。然而,一般的树却没有 我们应该如何从这两个二叉树中得到一个唯一的通用树呢 X X / \ / \ Y Z Z Y 这两个怎么样 X X / \ Y Y 另一方面, 如果您选择不区分二叉树的左或右子树,或者选择尊重常规树中出现的序列子树,只需将每个二叉树映射到
X X
/ \ / \
Y Z Z Y
这两个怎么样
X X
/ \
Y Y
另一方面,
如果您选择不区分二叉树的左或右子树,或者选择尊重常规树中出现的序列子树,只需将每个二叉树映射到自身即可。这将是每个二叉树的唯一通用树。是。以下转换是可逆的:
X X
/ \ / \
Y Z Z Y
给定一个具有有序但未索引的子级的通用树,
将第一个子节点编码为其父节点的左子节点,将其他每个节点编码为其(前)同级节点的右子节点
反之亦然:
给定一个具有区分左、右子节点的二叉树,读取节点的左子节点作为其第一个子节点,读取右子节点作为其下一个同级节点
那么,下面的树
a
/|\
b c d
a
/ \
b c
|
d
编码为
a
/
b
\
c
\
d
a
/
b
/ \
d c
而下面的树
a
/|\
b c d
a
/ \
b c
|
d
编码为
a
/
b
\
c
\
d
a
/
b
/ \
d c
(阅读:d
是b
的第一个孩子,c
是a
的兄弟姐妹)
请注意,您可以通过为根指定同级来编码任何根目录林(使用有序组件,否则表示不是唯一的),因此
a
/ \
b c
\ \
d e
将被解读为
a c e
/ \
b d
下面是从二叉树获取唯一通用(无向)树的另一种方法:
- 顶点二叉树可能有0…3个图邻居
- 将12个节点附加到根节点
- 将8个节点附加到每个左子节点
- 将4个节点附加到每个右子节点
- 使用至少12个邻居将节点标记为“根”。如果不是唯一的,则失败
- 用8..11个邻居标记每个节点“左”
- 用4..7个相邻节点标记每个节点“右”
- 除掉所有叶子
- 使所有边远离根部
- 如果任何节点有多个左子节点或多个右子节点,则失败
- 有序根树和二叉树之间有一个双射(第一个和第二个算法)
- 因为任何一般树都可以任意根,所以一般树(有向树或无向树)可以注入到二叉树
- 从二叉树到一般无向树的注入(第三种算法)
- 由于从二叉树到一般树以及从一般树到二叉树都有一个注入,所以在一般(有向或无向)树和二叉树之间必然存在一个双注入
(,)
(左子)(,(,)
(右子)是不同的,但不是一般的树:(())