【发布时间】:2014-04-19 18:15:41
【问题描述】:
我正在尝试从 pre/poststoreder traversals 构造一棵树。我的树类型如下:
data Tree = Emptytree | Node Integer [Tree]
我是函数式编程的新手。所以我在构建基本案例和递归时遇到了一些困难。我的函数将是这样的:
ListToTree :: [Integer] -> [Integer] -> Tree
我构建了一些算法,但无法使其符合语言要求。 我的算法很简单:我取第一个列表(前序遍历列表)的每个元素,然后检查它在第二个列表中的位置。举个例子吧:
1
/ \
2 5
/ \
3 4
这个Tree遍历的前序如你所知[1,2,3,4,5]
这个Tree遍历的后序如你所知[3,4,2,5,1]
首先,我查看第一个列表的第一个元素,它是 1,然后我查看它在第二个列表中的位置,它是最后一个,所以我将它添加到我的树中。然后我检查树的下一个元素,它在第二个列表中是 2,它在 1 的左侧,这意味着它是它的子元素。然后 3 在 2 的左边(在第二个列表中)这意味着它也是 2 的儿子然后我看 4 它在 2 的左边它是 2 的儿子,最后 5 它在左边1 它是一个的孩子(因为它在 2 的右边它不是 2 的孩子)。
我试图实现它。我编写了帮助函数来确定 Node 是否有孩子。我在我的函数中也使用了计数器所以实际上我的函数是这样的:
ListToTree :: Integer -> [Integer] -> [Integer] -> Tree
{-First Stands for counter ,2nd preorder, 3rd postorder-}
我的基本条件是:
1. is about if list are Emptytree return Emptytree
2. is about if counter== length-1 return Node element [Emptytree]
我的主要问题部分在我的递归部分:
ListToTree counter a b
| hasChild b counter == 1 = Node ( Element ) [ListToTree (1+counter) a b]
| hasChild b counter == 0 = Node ( Element ) [Emptytree]
{-My problematic part if node has no Child what I must change here-}
{-Or what are your suggestions-}
我需要帮助来改进我的算法。任何形式的帮助或 cmets 将不胜感激。
【问题讨论】:
-
是二叉树吗?如果不是,N在哪里定义?
-
它不是二叉树,它是 N 叉树,每个节点可以有不同数量的子节点
-
是否为非二叉树定义了后序和前序扫描?
-
你说的定义是什么?您可以使用前序和后序遍历来遍历所有 N 叉树
标签: haskell syntax tree functional-programming