我想在要列出的级别上编写所有节点。
type 'a tree = T of 'a * 'a tree * 'a tree;;
let at_level t lvl=
let rec aux t k =
match t with
|Leaf -> []
|T(x, l, r) -> if k = lvl then
(x::aux l (k+1)) @ (aux r (k+1))
else
(aux l (k+1)) @( aux r (k+1))
in aux t lvl;;
但我总是收到结果:[x]其中x是root的值。 我的计划中的问题在哪里?
答案 0 :(得分:2)
问题是你应该在调用aux t lvl
时调用aux t 0
,否则你从一开始就总是有k = lvl
(即在树的根部)。
另外,为什么在找到正确级别后拨打aux l (k+1)
?之后k = lvl
平等不可能是真的。
无论如何,这里是一些格式更改的代码:
type 'a tree = T of 'a * 'a tree * 'a tree | Leaf;;
let at_level tree lvl =
let rec aux t k = match t with
|Leaf -> []
|T(value, left, right) when k = lvl -> [value]
|T(value, left, right) -> (aux left (k+1)) @ (aux right (k+1))
in aux tree 0;;
# let tree = T(5,T(6,Leaf,Leaf),T(7,Leaf,Leaf));;
# at_level tree 1;;
- : int list = [6; 7]