我目前正在用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
我的方法只返回一个值,因此我的解决方案的实际问题是使递归部分正确。
所以我的问题是:我在这里做错了什么?
答案 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