我了解到,为了在序列化时保留BST的结构,需要按顺序存储,并且需要存储树的预订或后序表示法之一。
什么使得有序符号必不可少?
答案 0 :(得分:4)
注意:重写了答案,以前的版本不正确。
对于通用二叉树(具有唯一元素),您的语句将是正确的。考虑这两个输入(不是很精心绘制;-)):
如果使用按顺序遍历序列化这些序列,则两者都会产生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并随机选择节点以进行序列化和存储。检索时,它将按照存储的顺序检索,然后在事实之后 必须经过并连接所有节点。虽然这应该是可能的 - 所有信息都在那里 - 但似乎没有必要。每个节点都是浮动的;反序列化过程/程序必须在逐个连接的列表中维护所有节点(或类似节点)的列表。
另一方面,如果以某种规定的顺序存储它们,它可以在每个节点中构建树而读取 - 它知道连接节点的位置,因为它们是有序的(为清楚起见:这并不意味着下一个节点必须连接到先前读取的节点,在相邻叶子的情况下;向适当的分支跳跃足够的级别要简单得多。这应该更快,并且可能使用更少的内存(构建时没有列表/容器)。