在Lisp中搜索BST

时间:2013-04-23 18:26:02

标签: lisp scheme binary-search-tree

我正在编写一个程序,将机器人从BST指向目标号码。该程序有两个输入参数,一个目标作为整数,一个地图代表机器人可以遵循的所有路径。

ie :(机器人64'(53(()(64()())))))

其中64是目的地,53(()(64()())))是BST。

我需要帮助编写方法。这是我最初的工作。

(define (robot goal map)
  (let ((x (car map)))
    (define empty? '())
    (display x)
    (cond (empty? x)
          (robot goal (cadr map)))
    (cond ((= goal x)) (display x))
    (cond (< x goal)
          (robot goal (cadr map)))
    (cond (> x goal)
          (robot goal (caddr map)))
    ;(display "NULL")
  ) 
)

它应该搜索BST,如果找到了路径,它会打印(找到:#T#T ...#T#),如果你的目的地在树中而不是根目录(#是一个位置)数字和T是L或R,表示您在#位置左转或右转。

注意:直到昨天我才使用过Lisp,如果我有点失落,那就很抱歉。

1 个答案:

答案 0 :(得分:1)

程序的结构对于手头的问题是不正确的 - 您没有正确处理递归,并且您没有为请求的输出构建一个列表。这也不是使用cond的正确方法,您不应重新定义现有程序mapempty?。此外,如果元素不在树中会发生什么?在确定树是非空的之前,你不能(car tree)

我将提供正确的解决方案结构并给你一些提示,这样你就可以自己计算解决方案,如果在树中找不到元素,我们将返回一个值为{{1}的列表在最后一个位置。

not-found

请注意,搜索BST的正确方法始终是:

  1. 检查树是否为空
  2. 如果没有,请检查当前元素是否是我们正在寻找的元素
  3. 如果没有,请检查我们要查找的元素是否小于当前元素,如果是这样,请转到左侧子树
  4. 否则请转到右侧子树
  5. 作为最后的建议,不要忘记测试你的解决方案:

    (define (robot goal tree)
      (cond ((empty? tree)     ; if the tree is empty
             '(not-found))     ; return special value indicating it
            ((= <???> goal)    ; if the current element is goal
             <???>)            ; return a list with current element
            ((< goal <???>)    ; if goal is less than current element
             (cons <???>       ; cons current element
                   (cons <???> ; with L and advance the recursion
                         (robot goal <???>))))   ; going to the left
            (else              ; otherwise
             (cons <???>       ; cons current element
                   (cons <???> ; with R and advance the recursion
                         (robot goal <???>)))))) ; going to the right