【问题标题】:Tree traversal and serialization树遍历和序列化
【发布时间】:2012-05-01 13:53:46
【问题描述】:

我正试图弄清楚如何使用树遍历来唯一标识一棵树,问题的关键似乎在于该树是否是普通二叉树 (BT),或者它是否也具有作为二叉搜索树(BST)的更严格的规定。 article 似乎表明,对于 BT,单个中序、前序和后序遍历不会唯一标识一棵树(在此上下文中唯一表示键的结构和值)。以下是这篇文章的简要总结:

BT
1.我们可以用preorder + inorder和postorder + inorder唯一地重构一个BT。
2. 如果我们还规定遍历跟踪节点的空子节点,我们也可以使用前序+后序。

(一个悬而未决的问题(对我来说)是如果 BT 可以有非唯一元素,上述情况是否仍然正确)

BST
3. 我们不能使用 inorder 作为唯一 id。我们需要中序 + 预购,或中序 + 后序。

现在,(最后)我的问题是,我们可以仅使用预购还是仅使用后购来唯一标识 BST?我认为我们可以,因为这个问题和 answer 似乎说是的,我们可以使用预购,但非常感谢任何输入。

【问题讨论】:

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


    【解决方案1】:

    我不知道这里问的是什么。 任何二叉树,无论它是否有序,都可以通过写出重建树所需的操作序列来序列化。想象一个只有两条指令的简单堆栈机:

    • 将一棵空树(或者NULL指针,如果你喜欢的话)压入堆栈

    • 分配一个新的内部节点N,将一个值填入N,将栈顶的两棵树弹出栈并使其成为N em>的左右孩子,最后将N压入栈中。

    任何二叉树都可以序列化为此类机器的“程序”。 序列化算法使用后序遍历。

    【讨论】:

    • 你不会在这些遍历中访问空节点。所以你不能把像 NULL 这样的占位符放在他们的位置
    【解决方案2】:

    好的,您只能使用预购来识别一棵树。这是可能的,因为只有在前序遍历中,当前节点的 id 才会出现在子节点的 id 之前。所以你可以读取从根到叶的遍历输出。

    您可以查看http://en.wikipedia.org/wiki/Tree_traversal#Pre-order确认

    因此,您可以将前序遍历视为插入到树中的列表。因为插入 BST 的树是确定性的,所以当您将值列表插入空树时,您总是会得到相同的树。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多