【问题标题】:Ocaml help tree traversalOcaml帮助树遍历
【发布时间】:2012-08-12 04:26:18
【问题描述】:

问题描述:

R. Borist 教授研究树木。他记录了所有他最喜欢的树的前序、中序和后序遍历。然而,他办公室的一场大火烧毁了他存放顺序遍历的文件柜。他仍然拥有所有他最喜欢的树的前序和后序遍历,这些信息是否足以重建丢失的中序遍历?

您必须为以下任务设计和实现一个程序:输入将包括 两个数字列表。第一个列表是某棵树 T 的前序遍历。第二个列表是同一棵树 T 的后序遍历。输出应该是 T 的中序遍历。如果输入未确定唯一树,则任何一致的中序遍历可以退货。

如果它有助于设计您的实现,您可以假设:

  • 没有超过 1,000 个节点的树。
  • 没有树对多个节点使用相同的标签。
  • 节点标签是从 0 到 10,000 的数字。

样本数据

Input:
2 6 7 1 11 8 5 10 3 4 9
7 8 5 11 10 1 6 4 9 3 2
Output:
7 6 8 11 5 1 10 2 4 3 9

提示

给定一棵树的前序和后序遍历,你能推断出哪个元素是 根?哪些元素必须来自左子树?从右子树?递归。

首先解决当树中的每个节点都保证有 2 或 0 时的问题 孩子们。某些节点只有 1 个子节点的情况有点棘手。

备注

在您的文章中,您不需要分析解决方案的效率/运行时间(这将是未来项目的要求)。但是要分析它的正确性;即,清楚地解释为什么你的算法是正确的。

【问题讨论】:

  • 这似乎更像是一个逻辑难题,而不是 OCaml 问题。关键是节点是唯一编号的。提示似乎很不错:节点的左子树的根从预排序中是相当明显的。从后序来看,节点的右子树的根是相当明显的。但是,如果这些结果是同一个节点,这意味着什么?您可以递归地继续此操作以获取整棵树(好像——我还没有真正解决它!)。

标签: tree ocaml traversal inorder


【解决方案1】:

即使问题描述没有明确说明,但从提示中可以清楚地看出我们正在处理二叉树。

提示很好:找到树的根,然后找到左子树的根和右子树的根。

删除根后,在节点列表中寻找可以切割列表的位置:切割前的节点来自左子树,切割后的节点来自右子树。

像你一样做一些小例子是个好主意。

要具体回答“了解如何从前后遍历构建中序遍历”:首先从前后遍历重建树,然后从树构建中序遍历。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多