使用递归创建树

Posted

技术标签:

【中文标题】使用递归创建树【英文标题】:Creating a tree using recursion 【发布时间】:2016-01-02 17:21:27 【问题描述】:

我正在尝试从 OCAML 中的 int 列表创建树。我对函数式编程很陌生。到目前为止,这是我的功能:

let rec theList (lst : int list) = 
 match lst with 
  | [] -> Empty
  | h::t -> insert Empty h::theList List.tl lst

当 insert 是一个创建节点并将 h 的值放入节点的函数时。我尝试遍历列表,但是在使用参数调用 insert 之后在冒号处出现错误:“错误:变体类型 bstTree 没有构造函数 ::”,因为这是我定义为的类型:

type bstTree = Empty | bstTree * Node of int * bstTree

从广义上讲,我要做的就是递归遍历列表并在列表中的每个 int 上调用 insert。我已经为此工作了一段时间,因此感谢您的帮助,谢谢。

【问题讨论】:

【参考方案1】:

您的代码存在很多问题(如果您刚刚开始,这是可以预料的)。

首先,您的类型定义在语法上无效:

# type bstTree = Empty | bstTree * Node of int * bstTree;;
Error: Syntax error

你很可能想要这样的东西:

type bstTree = Empty | Node of bstTree * int * bstTree

其次,您定义了一个名为theList 的函数,但在函数内部您调用了一个名为fromList 的函数。我怀疑这些应该是同一个名字。

第三,不用调用List.tl,因为你已经匹配到t这个名字的列表尾部了。

第四,表达式中需要更多括号。一个好的起点可能是这样的:

insert Empty h (fromList List.tl lst)

正如编译器所指出的,您不能将构造函数:: 应用于bstTree 类型的值。 :: 构造函数仅适用于从一个元素和另一个(较小的)列表构建列表。

【讨论】:

感谢您的帮助。我做了你提出的必要更改并上线:h::t -> insert Empty h (fromList List.tl lst) 我现在收到一条错误消息:“错误:此函数的类型为 bstTree -> int -> bstTree 它应用于太多参数;也许你忘记了一个` ;'. insert: bstTree → int → bstTree" 而且我并没有真正看到/理解这个问题。 @杰弗里

以上是关于使用递归创建树的主要内容,如果未能解决你的问题,请参考以下文章

反应递归地创建动态树

自递归 SQL Server 数据库表创建树结构,为此创建模型,并在 Devexpress 中使用此数据

通过 PHP 使用 mysql 进行递归树遍历

非二叉树递归

二叉树遍历的非递归算法

非递归创建二叉树存在问题,求指点