您好我一直在寻找一些关于如何在F#中创建排序二叉树数据类型的好信息,但我找不到任何可以理解的内容。我已经在msdn-page上查看了这个例子,但是我没有得到它。
答案 0 :(得分:4)
如果您正在寻找现有的实现,那么the FSharpX library可以提供相当多的数据结构(包括一些树)。虽然我认为它没有直接实现已排序的二叉树。您也可以从F#访问所有.NET集合,但我不认为.NET也有二叉树。它有sorted list,这可能对你很好,取决于你想要做什么。
如果您想实现自己的,那么您需要首先定义一个数据类型来表示树:
type SortedTree<'T when 'T : comparison> =
| Node of SortedTree<'T> * 'T * SortedTree<'T>
| Leaf of 'T
Node
元素表示左侧的所有值都小于存储在节点中的值,所有更大(或相等)的值都在右侧。我添加了一个约束'T : comparison
,这意味着您只能创建具有可比元素的树(在实现中需要这对树进行排序)。
实现所有常见的树操作将会有相当多的工作,但是插入的简单尝试(不会使树以任何方式保持平衡)看起来像这样:
let rec insert element tree =
match tree with
| Leaf v when element < v -> Node(Leaf element, v, Leaf v)
| Leaf v -> Node(Leaf v, element, Leaf element)
| Node(left, key, right) when element < key -> Node(insert element left, key, right)
| Node(left, key, right) -> Node(left, key, insert element right)
模式匹配处理4个有趣的案例:当树为Leaf
时,您需要在左侧或右侧构建一个带有新元素的新节点。当树为Node
时,您需要向左或向右插入,具体取决于键的值。