【问题标题】:Breadth first search on binary trees in OCaml using queues使用队列在 OCaml 中对二叉树进行广度优先搜索
【发布时间】:2019-04-16 19:40:54
【问题描述】:

我想在 OCaml 中使用队列在二叉树上创建广度优先搜索,但我无法让它工作。

当节点没有任何“邻居”时,函数似乎卡住了。

let rec enque v l = 
    match l with
        [] -> [v]
    |   h::t -> h::(enque v t)



let rec qhd l =
    match l with
        h::[] -> h
    |   h::t -> qhd t



let deque l =
    match l with
        [] -> []
    |   h::t -> t



let notempty l = (l != [])


let rec breadthFirstHelp l =
    if notempty l
    then
        let cur = qhd l in
            match cur with
                Empty -> []
           |   (Node(Empty, node, Empty)) -> node::(breadthFirstHelp (deque l))
           |   (Node(left, node, right)) ->
               let l = enque right l in
               let l = enque left l in 
                   node::(breadthFirstHelp (deque l))
    else []

这是我正在测试的一棵树。

[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"; “乙”; “一个”; “一个”; "A"]

预期结果:["E"; “乙”; “F”; “一个”; “D”; “G”; “C”; "O"]

【问题讨论】:

    标签: tree ocaml binary-tree binary-search-tree breadth-first-search


    【解决方案1】:

    你的代码存在三个问题:

    首先,您的qhd 函数与您的dequeenque 函数不兼容。事实上,对于一个非空队列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 列表的第一个元素,如果它不为空,否则从底部列表重新填充它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多