【发布时间】:2009-08-02 20:54:36
【问题描述】:
如果只给出后序列表,我如何才能找到树的预订列表,反之亦然。此外,在树中,每个非叶节点都有两个子节点(即每个节点有两个或零个子节点。)
编辑:另一个给定的假设是每个节点的标签是唯一的,并且具有将其标识为内部节点或叶子的字段。我认为这应该消除单个预购或后购能够唯一识别一棵树的歧义。
【问题讨论】:
标签: algorithm tree binary-tree
如果只给出后序列表,我如何才能找到树的预订列表,反之亦然。此外,在树中,每个非叶节点都有两个子节点(即每个节点有两个或零个子节点。)
编辑:另一个给定的假设是每个节点的标签是唯一的,并且具有将其标识为内部节点或叶子的字段。我认为这应该消除单个预购或后购能够唯一识别一棵树的歧义。
【问题讨论】:
标签: algorithm tree binary-tree
如果不假设树中的节点具有将自身标识为内部或叶的字段,您将无法为您的问题找到唯一答案。该假设或有序列表必须可用于找到唯一的树。 在这种情况下,要找到一个可能的答案,您可以构建如下所示形式的树来匹配任何给定的后序列表:(假设后序列表为:1 2 3 4 5 6 7 8 9)
9[7[5[3[1,2],4],6],8]
现在您可以使用此树进行预订。
假设树中的节点有一个将自己标识为内部或叶子的字段,我们可以使用此算法从此类树的后序列表中生成一棵唯一的树:
【讨论】:
考虑前序遍历的递归结构:
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]
【讨论】:
例如: 您需要将后购形式转换为预购形式。这可以通过以下方式完成。 邮购:DEBFCA 预购:ABDECF 我们看到 A 是根。从preorder我们可以确定节点B留给A.因此我们创建了两个子类(BED)(CF)。现在当我们遍历B时,我们将其作为根,我们看到在B之后,D IS PRESENT ,这意味着D在B的左边,E在B的右边。现在我们遍历C。把它当作根。然后F在C之后,所以它被当作左边。
【讨论】: