F#为二叉搜索树制作ToString方法

时间:2012-11-25 14:39:52

标签: f# binary-tree

我目前正在用F#构建我的二叉树,而我几乎已经完成了。我在这个任务的最后一个任务,我应该做一个二叉树的字符串表示。这意味着树应该像这样呈现:

示例:("node" "value" ("node" "value" "Empty" "Empty") Empty)< - 一个树的根节点,其左子树的节点有两个空子树,一个空的右子树。

我的树看起来像这样:

 type Btree<'a when 'a: comparison> = 
 |Node of  'a * Btree<'a> *Btree<'a> 
 |Leaf of 'a 
 |EmptyTree 

这是我走了多远:

let rec treeToString bintree = 
    match bintree with
    |EmptyTree -> "Empty" //Check if the tree is empty
    |Node(inner, left, right) when inner = 0 -> "Empty"
    |Leaf x-> "Node"+x.ToString() //Returns "Node" and its value
    |Node(inner, left, right) when inner <> 0-> treeToString left //Need some kind of output here, but what?
    |Node(inner, left, right) when inner <> 0->treeToString right

我的方法只返回一个值,因此我的解决方案的实际问题是使递归部分正确。

所以我的问题是:我在这里做错了什么?

2 个答案:

答案 0 :(得分:3)

工会案例Leaf of 'a是多余的,因为Leaf(a)可以由Node(a, Empty, Empty)建模。类型声明可以简化为:

type BinTree<'a when 'a: comparison> = 
    | Empty 
    | Node of 'a * BinTree<'a> * BinTree<'a>

从输出样本("node" "value" ("node" "value" "Empty" "Empty") Empty),您应首先显示节点元素的值,然后递归显示左分支和右分支:

let rec treeToString bintree = 
    match bintree with
    | Empty -> "Empty"
    | Node(value, left, right) -> 
      sprintf "(Node %O %s %s)" value (treeToString left) (treeToString right)

您可以通过覆盖ToString()方法

来进一步推动这一点
type BinTree<'a> with
override x.ToString() = treeToString x

以便该类型与sprintf "%O" bintree等一起使用。

答案 1 :(得分:0)

使用rec声明一个函数只允许函数调用自身 - 它实际上并没有实现遍历策略(在你的情况下,遍历二叉树)。

您需要实现树的inorder traversal,如下所示:

let rec treeToString bintree = 
    match bintree with
    | EmptyTree -> "Empty" //Check if the tree is empty
    | Leaf x -> "Node" + x.ToString() //Returns "Node" and its value
    | Node(inner, left, right) when inner = 0 -> "Empty"
    | Node(inner, left, right) when inner <> 0 ->
        // Traverse the tree recursively
        treeToString left
        treeToString inner
        treeToString right