在球拍中创建二叉搜索树?

时间:2017-04-13 15:43:24

标签: scheme racket

尝试创建不可变二进制搜索树。我从创建构造函数开始创建空列表,以及使用以下代码逐个添加元素到树的方法。

#lang racket
(define (constructTree) '())

(define (addToTree Tree k v)

 (cond [(null? Tree)
           (cons Tree cons((cons k  '()) v))]
       [else
        (cond [(>(car Tree) k)
               (cons Tree cons((cons k  '()) v))
               ]
              [else
               (cons Tree '() cons((cons k  '()) v) )
               ]
              )]
      )
)


(define bst (addToTree (addToTree (addToTree (addToTree (constructTree)3 "3") 1 "1") 2 "2") 5 "5"))
bst 

我的意思是不可变的 如果我打电话给(define b0 (constructTree))
b0应该返回'()
(define b1 (addToTree b0 4 "4"))
b1应该返回'(4 "4" () ())
(define b2 (addToTree b1 6 "6"))
b2应该返回'(4 "4" () (6 "6" () ())) ...等。
但是我收到了这个错误:申请:不是程序;  期望一个可以应用于参数的过程   给出:'(3)   争论......:任何线索为什么我会收到这个错误或者我做错了什么?先感谢您。

1 个答案:

答案 0 :(得分:1)

我想你可能正在寻找这样的东西:

(define emptyTree '())

(define (addToTree Tree k v)
  (match Tree
    ['()
     (list k v '() '())]
    [(list key val left right)
     (if (> k key)
       (list key val left (addToTree right k v))
       (list key val (addToTree left k v) right))]))

请注意,由于不变性,每次都不需要构造新的空树。您可以为emptyTree添加空列表的别名。