在序列化BST时,为什么有序必不可少?

时间:2014-01-22 14:37:23

标签: algorithm data-structures binary-search-tree

我了解到,为了在序列化时保留BST的结构,需要按顺序存储,并且需要存储树的预订或后序表示法之一。

什么使得有序符号必不可少?

2 个答案:

答案 0 :(得分:4)

注意:重写了答案,以前的版本不正确。

对于通用二叉树(具有唯一元素),您的语句将是正确的。考虑这两个输入(不是很精心绘制;-)):

enter image description here

如果使用按顺序遍历序列化这些序列,则两者都会产生ABC。其他遍历类型也存在类似的情况。

那么,为什么有序和预购的组合足够?

预订的序列化形状为[root][left subtree][right subtree]。根很容易识别,但您不知道左子树的结束位置和右子树的开始位置。

现在考虑按顺序序列化:[left subtree][root][right subtree]。你知道root是什么(感谢预订),所以很容易识别左右子树。

请注意,如果权重不是唯一的,这仍然不够。如果在上面的示例中我们将B更改为A,则两个树都将为两种遍历类型生成[AAC]


对于二进制搜索树反序列化更容易。为什么?好吧,每个子树都具有左子树中的节点小于根的属性,而右子树中的节点更大。因此,可以轻松且明确地再次解析预订序列化[root][left subtree][right subtree]。所以,最后,告诉你BST需要至少两种序列化方法的人是错的(也许他也忘记了BST的属性)。

答案 1 :(得分:1)

在序列化时以某种顺序存储BST可能使得在检索时构建更简单。想象一下,您拥有BST并随机选择节点以进行序列化和存储。检索时,它将按照存储的顺序检索,然后在事实之后 必须经过并连接所有节点。虽然这应该是可能的 - 所有信息都在那里 - 但似乎没有必要。每个节点都是浮动的;反序列化过程/程序必须在逐个连接的列表中维护所有节点(或类似节点)的列表。

另一方面,如果以某种规定的顺序存储它们,它可以在每个节点中构建树读取 - 它知道连接节点的位置,因为它们是有序的(为清楚起见:这并不意味着下一个节点必须连接到先前读取的节点,在相邻叶子的情况下;向适当的分支跳跃足够的级别要简单得多。这应该更快,并且可能使用更少的内存(构建时没有列表/容器)。