Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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 将二叉树的前序列表转换为后序列表,反之亦然_Algorithm_Tree_Binary Tree - Fatal编程技术网

Algorithm 将二叉树的前序列表转换为后序列表,反之亦然

Algorithm 将二叉树的前序列表转换为后序列表,反之亦然,algorithm,tree,binary-tree,Algorithm,Tree,Binary Tree,如果只给出了后序列表,那么如何找到树的前序列表,反之亦然。此外,在树中,每个非叶节点都有两个子节点(即每个节点有两个子节点或零个子节点) 编辑:另一个给定的假设是每个节点的标签是唯一的,并且有一个字段将其标识为内部节点或叶。我认为这应该消除单个前序或后序能够唯一标识树的模糊性。考虑前序遍历的递归结构: T(r) = [r, T(r->left), T(r->right)] where T(r) is the preorder traversal of tree rooted at n

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


编辑:另一个给定的假设是每个节点的标签是唯一的,并且有一个字段将其标识为内部节点或叶。我认为这应该消除单个前序或后序能够唯一标识树的模糊性。

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

T(r) = [r, T(r->left), T(r->right)]
where T(r) is the preorder traversal of tree rooted at node r
然后我们知道由T(r)描述的树的根总是遍历中的第一个节点

知道这一点,并且知道树中的根始终高于其子树,请考虑如何使用此信息重建树。反复思考

警告:只有当这是一个二元搜索树时,才能执行此操作,该二元搜索树约束节点,使
左子。一般来说,不能通过一次遍历来重建树。有关更详细的说明,请参阅

无论关于0或2个子项的规则是什么,歧义仍然存在:

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

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

它们都具有前序遍历[4 2 1 3 5 6 7]

如果不假设树中的节点有一个字段将自己标识为内部或叶,则无法为您的问题找到唯一的答案。必须提供该假设或顺序列表才能找到唯一的树。 在本例中,为了找到一个可能的答案,您可以构建一个如下所示形式的树来匹配任何给定的postorder列表:(假设postorder列表为:1 2 3 4 5 6 7 8 9)

现在,您可以使用此树进行预订单列表

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

  • 从postorder列表的开头扫掠并查找第一个内部节点。在postorder列表中,此节点将恰好有两个位于此节点之前的叶子节点
  • 在树结构中,添加该内部节点,并在列表中使前面的两个节点成为其子节点
  • 从列表中删除这两个子节点,并使该内部节点成为叶
  • 转到步骤1并重复,直到列表变为空
  • 例如: 您需要将后订单表单转换为预订单表单。这可以通过以下方式完成。 邮购:DEBFCA 前订单:ABDECF
    我们看到A是根。根据前序,我们可以确定节点B是留给A的。因此我们创建了两个子类(BED)(CF)。现在当我们遍历B时,我们将其作为根,我们看到在B之后,D出现,这意味着D在B的左边,E在B的右边。现在我们遍历C。将其作为根。然后F在C之后出现,因此它被视为左边。

    对于常规二叉树来说,这是正确的。但我看到的是一个二叉树,其中每个节点都有0或2个子节点。我认为这使得前订单和后订单列表独一无二。不,这不会使它独一无二。考虑这个例子:5〔1,4[2,3]〕和5〔3〕[1,2],4。两棵树的预序遍历结果都是1 2 3 4 5。如果节点有一个能够识别自身为叶子或内部节点的字段,该怎么办?本例中的树具有只有一个子节点的节点。我感兴趣的树的节点要么有0个子节点,要么有2个子节点。任何节点都不允许只有一个子节点。所以这里不应该存在歧义问题。我编辑了我的答案,展示了一个反例,证明歧义仍然存在。你应该打印两棵树的后序遍历来证明歧义,因为只比较遍历。如果每个节点都有一个字段能够识别自己是叶子还是内部节点呢?@Jaelebi-是的,那就行了。有趣的是,如果同时进行了前序和后序遍历,就可以重建树——我记得。
    9[7[5[3[1,2],4],6],8]