【问题标题】:Convert Preorder listing of a binary tree to postorder and vice versa将二叉树的前序列表转换为后序,反之亦然
【发布时间】:2009-08-02 20:54:36
【问题描述】:

如果只给出后序列表,我如何才能找到树的预订列表,反之亦然。此外,在树中,每个非叶节点都有两个子节点(即每个节点有两个或零个子节点。)

编辑:另一个给定的假设是每个节点的标签是唯一的,并且具有将其标识为内部节点或叶子的字段。我认为这应该消除单个预购或后购能够唯一识别一棵树的歧义。

【问题讨论】:

    标签: algorithm tree binary-tree


    【解决方案1】:

    如果不假设树中的节点具有将自身标识为内部或叶的字段,您将无法为您的问题找到唯一答案。该假设或有序列表必须可用于找到唯一的树。 在这种情况下,要找到一个可能的答案,您可以构建如下所示形式的树来匹配任何给定的后序列表:(假设后序列表为:1 2 3 4 5 6 7 8 9)

    9[7[5[3[1,2],4],6],8]
    

    现在您可以使用此树进行预订。

    假设树中的节点有一个将自己标识为内部或叶子的字段,我们可以使用此算法从此类树的后序列表中生成一棵唯一的树:

    1. 从后序列表的开头扫一扫,找到第一个内部节点。该节点将恰好有两个叶子子节点,在后序列表中位于该节点之前。
    2. 在您的树结构中添加该内部节点并在列表中创建两个前面的节点作为其子节点。
    3. 从列表中删除这两个子节点,并将该内部节点设为叶。
    4. 转到第 1 步并重复,直到列表变为空。

    【讨论】:

    • 这对于常规二叉树来说是正确的。但我正在查看一个二叉树,其中每个节点都有 0 或 2 个孩子。我认为这使得预购和后购清单独一无二。
    • 不,这不会使它独一无二。考虑这个例子:5[1,4[2,3]] 和 5[3[1,2],4]。两棵树的前序遍历结果为 1 2 3 4 5。
    • 如果节点有一个字段可以识别自己是叶子节点还是内部节点呢?
    【解决方案2】:

    考虑前序遍历的递归结构:

    T(r) = [r, T(r->left), T(r->right)]
    where T(r) is the preorder traversal of tree rooted at node r
    

    那么我们知道T(r)所描述的树的根总是遍历中的第一个节点。

    知道这一点,并且知道树中的根总是比其子树高,请考虑如何使用这些信息来重建树。递归思考。

    警告:只有当这是一个二叉搜索树时才能做到这一点,它限制了left-child < root < right-child这样的节点。一般来说,树不能从一次遍历中重建。更详细的解释见this excellent resource

    无论关于 0 或 2 个孩子的规则如何,歧义仍然存在:

        4
       / \
      2   5
     / \ / \
     1 3 6 7
    
        4
       / \
      2   7
     / \
    1   3
       / \
      5   6
    

    两者都有前序遍历[4 2 1 3 5 6 7]

    【讨论】:

    • 示例中的树的节点只有 1 个子节点。我感兴趣的树有 0 个孩子或 2 个孩子的节点。不允许任何节点只有 1 个子节点。所以这里不应该存在歧义的问题。
    • 我已经编辑了我的答案,以展示一个反例来证明歧义仍然存在。
    • 你应该打印出两棵树的后序遍历来证明歧义,因为只比较遍历。
    • 如果每个节点都有一个能够识别自己是叶子节点还是内部节点的字段呢?
    • @Jaelebi - 是的,那会起作用。有趣的是,如果你有前序遍历和后序遍历,你可以重建树——我记得。
    【解决方案3】:

    例如: 您需要将后购形式转换为预购形式。这可以通过以下方式完成。 邮购:DEBFCA 预购:ABDECF 我们看到 A 是根。从preorder我们可以确定节点B留给A.因此我们创建了两个子类(BED)(CF)。现在当我们遍历B时,我们将其作为根,我们看到在B之后,D IS PRESENT ,这意味着D在B的左边,E在B的右边。现在我们遍历C。把它当作根。然后F在C之后,所以它被当作左边。

    【讨论】:

      猜你喜欢
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 2012-05-01
      • 2021-06-17
      相关资源
      最近更新 更多