问题描述:
R. Borist教授研究树木。他保留了所有他最喜欢的树木的预订,顺序和后序遍历的记录。然而,他办公室的火灾已经摧毁了他存储顺序遍历的文件柜。他仍然拥有所有他最喜欢的树的预订和后序遍历,这是否足以重建缺失的顺序遍历?
您必须为以下任务设计和实施程序:输入将包含 两个数字列表。第一个列表是某个树T的前序遍历。第二个列表是同一个树T的后序遍历。输出应该是T的inorder遍历。如果输入没有确定唯一的树,那么任何一致的顺序遍历可以退货。
如果它有助于设计您的实现,您可以假设:
示例数据
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的问题 儿童。一些节点只有一个孩子的情况有点棘手。
备注
在您的撰写中,您无需分析解决方案的效率/运行时间(这将是未来项目的要求)。但要分析它的正确性;即,清楚地解释为什么你的算法是正确的。
我正在背后的问题是理解如何从前置和后置构建顺序遍历。我试图找出一些具有5和7节点的小例子,如提示中但没有看到模式。帮助!
UPDATE 所以我想我想出了如何从另外两个列表中提出inorder遍历。我需要知道左子树右子树和根。根始终位于后期订单的末尾和预订的开头。左侧子树可以在两个列表中找到但更容易我认为从后期订单中得到它导致它在前面。然后是正确的子树和根。在预先顺序中,左子树是在根之后是右子树。我只需要帮助将思想纳入代码......
你可以使用ocaml中的索引拉出特定元素吗?
我无法在列表中告知子树的开始和结束,以及如何将信息拉出并从两个中返回一个列表
就像我知道x :: xs从列表中拉出第一个元素和简单的事情......
任何人都可以帮助或提供提示和建议我只考虑过一个案例,我有两个节点或没有节点作为孩子
更新:我不必用ocaml编写程序我可以使用我想要的任何语言。我熟悉java,所以我想在java中实现这个解决方案。
我非常了解如何获得前后订单列表所需的信息以便按顺序构建,所以我认为我解决了逻辑部分,但需要帮助将我的思想转化为java代码可以帮助吗?
答案 0 :(得分:2)
即使问题描述没有明确说明,但从提示中可以清楚地看到我们正在处理二叉树。
提示很好:找到树的根,然后找到左子树的根和右子树的根。
删除根后,在可以剪切列表的节点列表中查找位置:剪切前的节点来自左子树,剪切后的节点来自右子树。
像你一样制作小例子是一个好主意。
具体回答“理解我如何从前后遍历构建inorder遍历”:首先从遍历前和后遍历重建树,然后从树中构建inorder遍历。