排序二叉树F#

时间:2012-11-21 13:54:11

标签: f# tree

您好我一直在寻找一些关于如何在F#中创建排序二叉树数据类型的好信息,但我找不到任何可以理解的内容。我已经在msdn-page上查看了这个例子,但是我没有得到它。

1 个答案:

答案 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时,您需要向左或向右插入,具体取决于键的值。