我想知道是否有人可以为以下问题提供更简化的解决方案或改进我的代码。
假设我们有一棵树,其分支的深度为“d”,我们想要修剪这棵树,这样我们在深度 d 处保留“ n”个分支,然后在深度d-1处保留另一个 n 个分支;然后在d-2等另一个n分支...
在我的解决方案中,我需要使用 adictionary
来跟踪分支的数量和ref
可变深度以跟踪和降低深度级别
很想知道一个更简单、更优雅的解决方案,或者任何提示/技巧来改进我所拥有的
数据结构
type MultiTree = | MNode of int * list<MultiTree>
测试树
let Mtree2 = MNode (0,
[MNode (1,[MNode (2,[MNode (3,[])])]);
MNode (1,[MNode (2,[MNode (3,[])])]);
MNode (1,[MNode (2,[MNode (3,[])])]);
MNode (1,[MNode (2,[MNode (3,[])])]);
MNode (1,[MNode (2,[MNode (3,[])])]);
MNode (1,[MNode (2,[MNode (3,[])])])])
修剪树功能
let trimTree noLosses depth t=
let mlimit = ref depth
let dict = Dictionary()
let fn k =
match dict.TryGetValue(k) with
| true, l -> dict.[k] <- l + 1
|_ -> dict.Add(k,1)
if dict.[k] >= noLosses then mlimit := !mlimit - 1 else mlimit := !mlimit
let rec loop d t =
match t with
| MNode(i,sub) when d > !mlimit ->
fn !mlimit
MNode(i, List.map (loop (d+1)) [])
| MNode(i,sub) -> MNode(i, List.map (loop (d+1)) sub)
loop 1 t
let Mtree2trimmed = Mtree2 |> trimTree 3 2
结果
使用 Thomas P 的“printTree”函数可以很好地可视化
let printt tree =
let rec loop depth (MNode(n, sub)) =
printfn "%s %A" depth n
for s in sub do loop (depth + " ") s
loop "" tree
输出 -
printt Mtree2
0
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
1
2
3
输出 -
printt Mtree2trimmed
0
1
2
1
2
1
2
1
1
1
所以,如果你已经做到了这一步 - 有什么建议吗?
干杯!