查找二叉树结构方案中的项列表

时间:2014-05-25 08:08:33

标签: scheme racket

在Scheme中编写一个函数,该函数接收作为条目参数的学生结构实例的二叉搜索树 ,一个出生年份列表,并返回一个代码列表列表,表明每年提供的出生日期。

示例:

这是二叉树

(make-árbol-bin  
(make-estudiante 5 "35889188" "Victor" (make-fecha 10 6 1991) "calle 67 con cra 20" "4444444")  (make-
árbol-bin  
(make-estudiante 2 "6457234" "Manuel" (make-fecha 12 10 1992) "calle 56 con cra 33" "5555555")   (make-árbol-bin 
   (make-estudiante 1 "94252688" "Estela" (make-fecha 20 5 1993) "calle 4 con cra 2" "3333333")    empty    empty)   empty) 
 (make-árbol-bin 
(make-estudiante 7 "34987678" "Juan" (make-fecha 25 3 1995) "calle 34 con cra 12" "6666666")   empty 
 empty) 
)

列出年份

(list 1992 1991 )  

它应该返回一个代码列表列表:

((list (list 2) (list 5)  ) 

我做了这个,但我不能让我返回列表列表

(define-struct fecha ( dia mes año))

这是学生的结构:

(define-struct estudiante ( codigo id nombre fechanaci direccion telefono))

这是二叉搜索树的结构:

(define-struct arbol-bin( estudiante nod-izq nod-der)) 

我做了这个

(define (elimina X L)
        (if(null? L) '()
        (if (equal? X (car L))
            (elimina X (cdr L))
            (cons (car L) (elimina X (cdr L))))))

(define (busca d tree)
(if (null? tree)
    #f
    (let ((node (arbol-bin-estudiante tree)))
      (let ((n (estudiante-codigo node))) 
      (let ((fe (estudiante-fechanaci node)))
      (if (or(equal? d (fecha-año fe))
             (busca d (arbol-bin-nod-der tree)))
          n
            (busca d (arbol-bin-nod-izq tree))))))))

(define (pert lst tree)
(elimina false (map (lambda (d) (busca d tree)) lst)))

和这个

(pert (list 1992   1991 )  tree)

返回

(list 2 5)

我能做的就是让我回复:

((list (list 2) (list 5)  )
请帮助我!

1 个答案:

答案 0 :(得分:0)

您无法返回((list (list 2) (list 5))),因为它不是正确的Scheme表达式。你可以让它返回(list (list 2) (list 5))

> (list (list 2) (list 5))
'((2) (5))

为此,在busca中,只需将n替换为(list n)

(define (busca d tree)
  (if (null? tree)
      #f
      (let ((node (árbol-bin-estudiante tree)))
        (let ((n (estudiante-codigo node))) 
          (let ((fe (estudiante-fechanaci node)))
            (if (or (equal? d (fecha-año fe))
                    (busca d (árbol-bin-nod-der tree)))
                (list n) ; <------
                (busca d (árbol-bin-nod-izq tree))))))))

> (list (list (list 2) (list 5)))
'(((2) (5)))

将上述行更改为(list (list n))