Tree 基于队列的OCaml二叉树广度优先搜索
我想使用队列在OCaml中的二叉树上创建一个广度优先搜索,但我无法让它工作 当一个节点没有任何“邻居”时,函数似乎会被卡住 这是我正在测试的一棵树Tree 基于队列的OCaml二叉树广度优先搜索,tree,ocaml,binary-tree,binary-search-tree,breadth-first-search,Tree,Ocaml,Binary Tree,Binary Search Tree,Breadth First Search,我想使用队列在OCaml中的二叉树上创建一个广度优先搜索,但我无法让它工作 当一个节点没有任何“邻居”时,函数似乎会被卡住 这是我正在测试的一棵树 [tree = Node (Node (Node (Empty, "A", Empty), "B", Node (Node (Empty, "C", Empty), "D", Empty)), "E", Node (Empty, "F", Node (Empty, "G", Node (Empty, "O",
[tree =
Node
(Node
(Node (Empty, "A", Empty), "B",
Node (Node (Empty, "C", Empty), "D", Empty)),
"E", Node (Empty, "F", Node (Empty, "G", Node (Empty, "O", Empty))))]
我的代码:[“E”;“B”;“A”;“A”;“A”]
预期结果:[“E”;“B”;“F”;“A”;“D”;“G”;“C”;“O”]您的代码中有三个问题: 首先,您的
qhd
功能与deque
和enque
功能不兼容。实际上,对于非空队列q
和值any
,在队列末尾添加元素不会改变顶部的元素:
qhd q = qhd (enque any q)
而对于队列q
的实现,使得deque q
不是空的,则
qhd q = qhd (deque q)
其次,在breadthFirstHelp函数中,即使在l
中有挂起的子树,空的大小写始终返回[]
修复这两个问题应该会得到正确的结果,但是还有最后一个性能问题:enque
函数非常扩展,因为它需要遍历整个队列
一个简单的解决方案是将列表一分为二
type 'a queue = { top: 'a list; bottom: 'a list }
当底部列表按相反顺序保存时。因此,添加到队列就是在底部列表的顶部添加。然而,如果队列不是空的,则弹出队列只需要获取top
列表的第一个元素,否则从底部列表重新填充
type 'a queue = { top: 'a list; bottom: 'a list }