Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在序列化BST时,为什么顺序是必需的?_Algorithm_Data Structures_Binary Search Tree - Fatal编程技术网

Algorithm 在序列化BST时,为什么顺序是必需的?

Algorithm 在序列化BST时,为什么顺序是必需的?,algorithm,data-structures,binary-search-tree,Algorithm,Data Structures,Binary Search Tree,我了解到,要在序列化BST时保留其结构,需要按顺序存储树的一个预顺序或后顺序符号 是什么使按顺序表示法必不可少?在序列化时以某种顺序存储BST可能会使基于检索的构建更简单。假设您拥有BST,只需随机选取节点进行序列化和存储。在检索时,它将按照存储的顺序进行检索,然后在事实发生后,某些内容必须经过并连接所有节点。虽然这应该是可能的——所有的信息都在那里——但似乎没有必要。每个节点都是浮动的;反序列化过程/程序在逐段遍历连接的列表时,必须维护所有节点(或类似节点)的列表 另一方面,如果您以某种指定的

我了解到,要在序列化BST时保留其结构,需要按顺序存储树的一个预顺序或后顺序符号


是什么使按顺序表示法必不可少?

在序列化时以某种顺序存储BST可能会使基于检索的构建更简单。假设您拥有BST,只需随机选取节点进行序列化和存储。在检索时,它将按照存储的顺序进行检索,然后在事实发生后,某些内容必须经过并连接所有节点。虽然这应该是可能的——所有的信息都在那里——但似乎没有必要。每个节点都是浮动的;反序列化过程/程序在逐段遍历连接的列表时,必须维护所有节点(或类似节点)的列表


另一方面,如果您以某种指定的顺序存储它们,它可以在读取每个节点时构建树,因为节点是有序的,它知道在哪里连接节点(为了清楚起见:这并不意味着在相邻叶的情况下,下一个节点必须连接到先前读取的节点;只不过跳到适当的分支更简单而已)。这应该更快,并且可能使用更少的内存(构建时没有列表/容器).

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

对于一般的二叉树(具有唯一的元素),你的语句是正确的。考虑这两个输入(不是非常漂亮的绘制;-):

如果您使用顺序遍历对它们进行序列化,则两者都会产生
ABC
。其他遍历类型也存在类似的情况

那么,为什么顺序和预顺序的组合就足够了

预订单的序列化形状是
[root][left subtree][right subtree]
。根很容易识别,但您不知道左子树的终点和右子树的起点

按序列化顺序考虑:<代码> [左子树] [根] [右子树] < /代码>。您知道根是什么(由于预排序),因此很容易识别左子树和右子树

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



对于二进制搜索树,反序列化要容易得多。为什么?每个子树都有一个特性,左边子树中的节点比根小,而右边子树中的节点比根大。因此,可以轻松、明确地再次解析预排序序列化
[root][left subtree][right subtree]
。因此,总而言之,那个告诉您BST至少需要两种序列化方法的人是错误的(也许他还忘记了BST的属性).

我相信可以证明重建BST需要顺序+预顺序或顺序+后顺序。但老实说,我会用父/子关系和每个节点的数据对其进行序列化。你在说什么表示法?出于某种原因,我认为他指的是Java序列化,但这个答案清楚地解释了“字符串序列化”就足够了。比我的答案更彻底/清楚一点;)。谢谢!