2014-08-28 2 views
1

Я пытаюсь построить дерево в языке схемы, начиная с ввода строки. Ниже то, что я попробовал -Построение дерева из символического ввода

(define travsal (lambda (tree) 
      (cond 
       ((null? tree) '()) 
       (#t (append (travsal (car tree)) (cons (cadr tree) 
(travsal (caddr tree)))))))) 

(define tree1 '(((() 4()) 2 (() 5())) 1 ((() 6()) 3 (() 7())))) 

    (display tree1) 
    (newline) 

    (travsal tree1) 

Как вы можете видеть его только итерация материалы, представленные и не делать то, что фактическое бинарное дерево должно делать. Я поражен логикой о том, как сохранить дерево с помощью узлов и дочернего элемента из символьного ввода, например - "(((() 4()) 2 (() 5())) 1 ((() 6()) 3 (() 7())))), а затем распечатать его, как описано выше, это печать.

Пожалуйста, помогите, я был задан этот вопрос в интервью и до сих пор не могу его решить.

+1

Теперь они задают вопросы Схемы в интервью? фантастика! где эта работа, поэтому я могу обратиться к ней? : P –

ответ

0

Что значит «не делать то, что фактическое бинарное дерево должно делать»? , Код обхода в порядке, он делает in-order traversal дерева. Крепление ряд вопросов форматирования:

(define travsal 
    (lambda (tree) 
    (cond ((null? tree) '()) 
      (else (append (travsal (car tree)) 
         (cons (cadr tree) 
           (travsal (caddr tree)))))))) 

Теперь, имейте в виду, что дерево Предоставленный двоичная но не отсортированные:

(define tree1 '(((() 4()) 2 (() 5())) 1 ((() 6()) 3 (() 7())))) 

Если мы рисуем его, он будет выглядеть следующим образом:

 1 
    / \ 
    2  3 
/\ / \ 
4  5 6  7 

Который, после того, как в обход заказ будет правильно давать этот результат при использовании travsal процедуры:

(travsal tree1) 
=> '(4 2 5 1 6 3 7) 
+0

Если должно быть напечатано бинарное дерево предварительного заказа или почтового отправления, то мне нужно написать логику, начиная с нуля. Вместо этого, если бы я мог сначала сохранить дерево и применить к нему логику вывода. Или это будет хорошо, что у меня есть? –

+0

Я не следую за тобой. Как вы хотите «распечатать» его? это обход, или фактический рисунок? , Если вы хотите перейти от, скажем, к предварительному заказу для отправки по дате, вам придется написать другую процедуру (но это просто, просто измените порядок параметров на 'append', добавив корень в список). Представленное древовидное представление прекрасно, нет необходимости хранить его в другом месте, вы можете применить выходную логику непосредственно к ней. –

+1

Спасибо, Оскар, что будет. –