1.介绍

序列化将数据结构或对象转换为一系列比特,使得它可以存储在文件或存储器缓冲器中,或者通过网络发送。在未来,我们可以将序列进行反序列化以重建相同的数据结构或对象。

在本教程中,我们将介绍算法以序列化和反序列化a二叉树

2.二叉树定义

二叉树是一个层次结构数据结构,每个节点在大多数两个孩子。二进制树的每个节点都有3个元素:数据元素以保存节点数据和两个子指针指向其左和右子的子元素。如果子节点不存在,我们使用空值代表:

有3个主要二叉树遍历方法:预订,有序和后订单。我们可以使用两种方法的组合序列化和反序列化二叉树,例如,预订和有序方法

在本教程中,我们将展示如何使用单树遍历方法序列化和反序列化二进制树。例如,我们可以使用预级遍历序列化二进制文件,并使用相同的方法将其进行反序列化。

3.使用预订遍历序列化二叉树

我们可以使用预订遍历算法序列化二叉树。在预订二叉树遍历中,我们首先遍历根节点。然后,我们分别遍历其左和右子树。例如,我们可以在订单中预订遍历上面的示例树:1,2,4,5,3,6

当我们序列化树时,我们也考虑空值节点。在这种情况下,我们可以使用\代表A.空值节点。因此,预订序列变为:1,2,4,\#,\#,5,\#,\#,3,\#,6,\#,\#

我们可以使用递归预购遍历算法来构建序列化序列:

QuickLatex.com呈现

在这种算法中,我们首先序列化根节点数据,然后递归地序列化其左右子和右子。如果我们见面空值节点,我们还使用特殊字符序列化它\

如果二进制树包含N节点,该算法的总运行时间是上)因为我们只访问每个节点一次。空间要求也是如此上)存储序列化序列。虽然我们需要额外的空间来存储空值序列化序列中的节点,额外的空间最多2n.因为每个节点都有两个孩子。

4.使用预订遍历进行反序列化二叉树

我们可以使用相同的预订算法将序列反驳到二进制树:

QuickLatex.com呈现

出于算法描述的简单性,我们使用序列化序列的迭代器对象作为递归函数的输入。不同的编程语言具有类似的迭代器支持。例如,我们可以使用一个迭代器java中的界面。

反序列化过程类似于序列化过程。我们首先将根节点数据进行反序列化,然后递归地将其左和右子组化。如果我们看到一个特殊的角色\,我们将其命名为一个空值节点。

整体运行时间和空间要求都是上)由于我们只构建每个节点一次。

5.用次级遍历后序列化二叉树

类似于预购遍历,我们可以使用使用订单后遍历算法序列化二叉树。在次级二叉树遍历中,我们首先分别遍历其左和右子树。然后,我们终于访问根节点。我们可以使用递归后遍历遍历算法来构建序列化序列:

QuickLatex.com呈现

在该算法中,我们首先递归地序列化左右子化。然后,我们最终序列化根节点数据。整体运行时间和空间要求也是如此上)

6.将后级遍历序列进行反序列化

在预订序列化中,我们将根节点放在序列的开头。但是,我们在序列后序列结束时将根节点放在序列后序列化。例如,我们可以在订单中遍历示例树:\#,\#,4,\#,\#,5,2,\#,\#,\#,6,3,1 1。因此,后级遍历是预订遍历的反向操作。

要序列化后期遍历序列,我们可以首先反转序列,然后使用修改后的预级解序流程来构建二进制树:

QuickLatex.com呈现

在遍历后遍历中,我们按顺序遍历树:

  • 左子树
  • 右子子树
  • 根节点

由于我们的解序流程以后向顺序工作,因此我们首先将根节点进行反序列化。然后,我们将正确的子树反序列化。最后,我们将左子评级反序列化。

整体运行时间和空间要求都是上)由于我们只构建每个节点一次。

7.有序遍历二叉树序列化和反序列化

我们不能使用秩序的遍历遍历方法来序列化和反序列化二叉树。在一级二叉树遍历中,我们首先遍历左子树。然后,我们访问根节点并遍历右子树。此遍历使得很难在序列化序列中定位根节点。

例如,以下二进制树的按顺序遍历可以生成序列:\#,2,\#,1,\#

但是,我们可以在以下二叉树上生成相同的序列:

因此,由于相关树不是唯一的,我们无法将有序序列返回到二叉树。

结论

在本教程中,我们展示了两个算法,预购遍历和遍历后遍历,以序列化和反序列化二叉树。我们还表明,遍历遍历算法不适合二叉树序列化和反序列化。

最后,我们确认所有序列化和反序列化算法都具有线性时间和空间复杂性。

评论在本文上关闭!