2017-04-13 49 views
0

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

#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) 参数...:
任何线索为什么我得到这个错误或我做错了什么?先谢谢你。

+0

直接的问题是,在某些情况下,你已经把'cons'放在了parens的外面。 –

+0

@BrendanCannell我不明白你的意思,因为你知道我的球拍和功能语言的第一次代码 – kero

+1

在所有三种情况下,'(cons树cons((cons k'())v))'应该是(cons树(cons(cons k'())v))'。 –

回答

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作为空列表的别名即可。

+0

嘿布伦丹,对不起,如果我讨厌你,但你知道是否有任何buildin函数遍历树并返回键和值如果存在 – kero

+1

@kero这是没有问题的。 (定义(查找键树) (匹配树 ['()#f] [(list kv left right) (cond [ (> k键)(查找键左) [(