2016-10-13 6 views
1

Je travaille sur la traversée de commande de poste à un arbre de recherche binaire. Voilà ce que j'ai jusqu'à présentTraversée de commande de poste dans le schéma

(define (head tree) 
    (car tree)) 
(define (left tree) 
    (cadr tree)) 
(define (right tree) 
    (caddr tree)) 

    (define (post-order node) 
    (if (null? node) 
      '() 
      (append (cons (post-order (left node)) 
      (post-order (right node))) 
      (head node)))) 

J'attends ce code peut renvoyer une liste de traversée poste de commande. Cependant, il ne compile même pas. L'erreur est

mcar: contract violation 
    expected: mpair? 
    given: 5 

J'ai vérifié la syntaxe de append et le contre. Et je ne peux toujours pas comprendre ce problème. Il semble qu'il y ait quelque chose qui ne va pas dans la logique plutôt que dans la syntaxe.

Pouvez-vous le signaler et l'expliquer. Je vous remercie.

Répondre

2

Avec append les arguments sont des listes. Dans votre code, vous ajoutez le head en tant que valeur pointée et ainsi cette liste peut uniquement afficher le dernier argument en append. Cela le corrigerait:

(define (post-order node) 
    (if (null? node) 
     '() 
     (append (post-order (left node)) 
       (post-order (right node)) 
       (list (head node))))) 
+0

Cela fonctionne. Merci pour cette explication claire:) –