2013-12-08 9 views
0

type'a tree = |空| 'a *'节点树*'树*'树参考;OCaml - 设置对inorder(二叉树)中下一个节点的引用

我们想为每个节点树设置ref inorder中的下一个节点;

例如

Node (1, Node(2, Empty, Empty, ref Empty), Node(3, Empty, Empty, ref Empty), ref Empty)) 
The result is: 

Node (1, Node(2, Empty, Empty, content = {Node (1....) })..... 
+0

除非您向我们展示您编写的一些代码,并解释其为什么以及如何不执行您想要的任务,否则很难在不破坏任务的情况下提供帮助。作为一个普遍的暗示,我会说这需要折叠。你必须决定为最后一个节点做些什么。 –

+0

我真的建议你学习ocaml和函数式编程。我想你的老板让你用ocaml来实现某些东西,但是你的java命令式的直觉将你引向邪恶。请,只要学习。 –

+0

如何在这种情况下使用折叠? – user3077133

回答

0

不难:你做的序遍历,同时通过各地(和 返回)包含在一个节点的参考。当给定节点获得 时,将前一节点的参考设置为 当前节点。如果每个节点都被分配到之前的参考节点,那么意味着每个节点的引用都包含下一个节点。

在该实例中,序遍历穿过树本 顺序:2 1 3

当你在节点2,则它的引用返回给调用者,这是 节点1当到达节点1,则将节点2的ref设置为 指向节点1,并将节点1的ref传递给节点3.当 处于节点3时,将节点1的ref设置为指向节点3.

您需要决定如何处理第一个节点(分配虚拟 引用来启动进程)和最后一个节点(大概设置 对Empty的引用,尽管有时它可能对 将它设置为第一个节点有用)。

我有工作代码(15行)。我不会发布它,因为这将 破坏假定的分配。