Двоичное дерево для перечисления в обратном порядке в ракетке

Привет, я пытаюсь передать двоичное дерево в список, но пересекаю его в обратном порядке.

(define (postorden arbol)
  (if (null? arbol) 
    ('()) (append (append (postorden (car (cdr arbol))) 
                          (postorden (car (cddr arbol)))) 
                  (list (car arbol)))))

Но я получаю эту ошибку:

cdr: нарушение контракта    ожидается: пара? дано: 'нулевой

Но, например, с этим деревом: '((1 2) ((7 10) ((2 4) null null)) ((6 8) ((10 13) null null) null))

выполнил cdr и получил: (((7 10) ((2 4) null null)) ((6 8) ((10 13) null nul) null)) и затем я делаю машину к этому результату: '(( 7 10) ((2 4) null null)) что, если это пара. Так что я не понимаю, что не так.

Заранее спасибо.


person luis    schedule 22.11.2014    source источник


Ответы (1)


Выражение if имеет for (if e0 e1 e2), где e0, e1 и, e2 — выражения. В вашей программе есть:

(if e0
    ('() ...)
    e2)

Это означает, что если e0 истинно, то оценивается ('() ...).

Здесь '() — это пустой список, также известный как null.

Выражение ('() ...) попытается вызвать '() с результатом ... и, таким образом, выдаст ошибку.

Исправьте эту ошибку, и, надеюсь, другие ваши ошибки исчезнут - если нет, покажите нам, что у вас есть, и спросите еще раз.

person soegaard    schedule 22.11.2014