Tree 基于队列的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",

我想使用队列在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", 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 }