2013-05-16 3 views
1

Я пытаюсь написать алгоритм обхода обхода для двоичного дерева с использованием RACKET/DR. РЭКЕТДвоичное дерево inorder traversal Racket

(define (print-records node number) 
     (cond 
     [(not (empty? node-left))(print-records (node-left node) number)] 
     *Do This before moving to next IF clause* 
     [(not (empty? node-right))(print-records(node-right node) number)] 

    )) 

Я пытаюсь следовать следующему алгоритму

InOrder(node) 
if node is null return 
InOrder(node.left) 
Print(node) 
InOrder(node.Right) 

Моя проблема заключается в том, что через COND я могу исполнить одно выражение, и она будет пропускать все остальное. Я попытался добавить два выражения под одним, это не сработало, например, ((a) (b)). Я также пытался сделать вспомогательную процедуру, но это тоже не сработало.

ответ

2

Вы используете cond неправильным способом. Обратите внимание, что вам нужно рекурсивно пройти левую часть дерева, затем посетить текущий узел, а затем рекурсивно пройти правую часть дерева - они не являются взаимоисключающими альтернативами, три шага должны выполняться именно в этом порядке. Попробуйте что-нибудь подобное вместо этого:

(define (print-records node number) 
    (unless (empty? (node-left node)) 
    (print-records (node-left node) number)) 
    (print (node-value node)) ; replace this line with the actual printing code 
    (unless (empty? (node-right node)) 
    (print-records (node-right node) number))) 

Некоторые пояснения:

  • (unless <condition> <body>) просто сокращенная для (cond ((not <condition>) <body>)).
  • Реальная работа обхода выполняется между двумя рекурсивными вызовами, в этом случае я написал в качестве примера (print (node-value node)), заменив эту строку фактическим кодом печати для значения текущего узла.
  • Непонятно, что вы намерены делать с параметром number, так как он просто передается, не используется.
+0

Он имеет проблемы с функцией * печать *. Он ожидает одно выражение, но вы предоставили 2 дополнительных (после того, как я думаю) – Achilles

+1

@Achilles, как я сказал выше: это всего лишь пример. Я не знаю, какую функцию печати вы должны использовать, замените эту строку на фактический код. Пожалуйста, перечитайте мой ответ, я отредактировал его, чтобы сделать его более ясным. –

+0

В этой строке я в основном хочу вызвать функцию, которая выводит результат пользователю (он делает сравнение между «числом» и значением узла, прежде чем выбирать, что печатать. – Achilles

2

Прогулка по двоичному дереву - очень общая операция. Вы можете сделать общую процедуру, а затем специализировать ее с помощью функции, применяемой к каждому узлу.

(define (walker node function) 
    (unless (empty? node) 
    (walker (node-left node) function) 
    (function node) 
    (walker (node-right node) function))) 

Примечание: это хорошо, чтобы проверить empty? в начале функции.

(define (print-records node number) 
    (walker node (compose print node-value))) ; ignore number, it seems. 

Вы также могли бы работать в этом качестве:

(define (walking-with function) 
    (letrec ((walker (lambda (node) 
        (unless (empty? node) 
         (walker (node-left node)) 
         (function node) 
         (walker (node-right node)))))) 
    walker)) 
(define print-records-for (walking-with (compose print node-value))) 
(print-records-for node) 
> ... 
Смежные вопросы