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

编辑:另一个给定的假设是每个节点的标签是唯一的,并且有一个字段可以将其标识为内部节点或叶子。我认为应该摆脱单个预订单或后序的模糊性,以便能够唯一地识别树。

有帮助吗?

解决方案

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

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

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

假设树中的节点有一个标识为内部或叶子的字段,我们可以使用此算法从这种树的后序列表中创建一个唯一的树:

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

其他提示

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

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节点。通常,树木不能通过单次遍历重建。有关更详细的说明,请参见此优秀资源

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

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

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

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

例如: 您需要将售后订单转换为预订单。这可以通过以下方式完成。 发布订单:DEBFCA 预购:ABDECF 我们看到A是根。从预先排序我们可以确定节点B留给A.因此我们创建了两个子类(BED)(CF)。现在,当我们遍历B时,我们将它作为根,我们看到在B之后,D是现在,它表示D留给B,E正对B.现在我们遍历C.将它作为根。然后在C之后存在F,所以它被取为左。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top