使用scheme在二叉搜索树中插入节点键和值

时间:2012-10-16 08:34:54

标签: scheme racket binary-search-tree

我将一个键key和一个值val插入到树形图t中,返回一个新树,其中包含一个包含该键的节点和相应位置的值。 / p>

我定义了这个:

(define (tree-node key value left right)(list key value left right))

(define (get-key tn) (node_key tn))
(define (get-val tn) (node_val tn))
(define (get-left tn) (node_left tn))
(define (get-right tn) (node_right tn))

(define (node_key tn) (list-ref tn 0))
(define (node_val tn) (list-ref tn 1))
(define (node_left tn) (list-ref tn 2))
(define (node_right tn) (list-ref tn 3))

我正在尝试这个insert方法

(define (insert t key val)

  (cond (empty? t))
  (tree-node (key val '() '()))

  ((equal key (get-key t))
   (tree-node (key val (get-left t) (get-right t)))

   ((<key (get-key t))
    (tree-node ((get-key t) (get-val t) (insert (get-left t key val)) (get-right t)))
    (tree-node ((get-key t) (get-val t) (get-left t) (insert (get-right t key val)))))))

我用它来定义

(define right (insert (insert empty 3 10) 5 20))

我在DrRacket中收到此错误

application: not a procedure;
expected a procedure that can be applied to arguments
given: (list 0 1 2)
arguments...: [none]

1 个答案:

答案 0 :(得分:1)

正在发生的是树节点(它只是一个列表)正在一个预期函数的位置返回。 Scheme无法执行列表 - 它不是一个函数,所以它在抱怨。

我怀疑这是因为你搞砸了你的括号。

(cond (empty? t))

是一种独立的化合物表达。它被评估,返回t的值。之后的表达式不作为cond的一部分进行评估。