2009-12-06 5 views
0

너비가 넓은 첫 번째 (수준) 트리 순회를 구현하려고합니다. 나는 아주 가깝지만, 나는 중복을 어떻게 얻고 있는지 알 수 없다. 어떤 도움이라도 대단히 감사합니다. 미리 감사드립니다. JR스키마의 첫 번째 이진 트리 탐색

(define (atom? x) 
    (not (pair? x))) 

;;Functions to manipulate a binary tree 
(define (leaf? node) (atom? node)) 
(define (left node) (cadr node)) 
(define (right node) (caddr node)) 
(define (label node) (if (leaf? node) node (car node))) 

;; Breadth First using queue 
(define (breadth node) 
    (q 'enqueue! node)    ;; Enqueue tree 
    (output 'enqueue! (label node)) ;; Output root 
    (helper node) 
    (output 'queue->list)   ;; Output elements in queue 
) 
(define (helper node) 
    (if (not(q 'empty?))   ;; If queue is not empty 
    (begin 
     (if(not(leaf? node)) 
     (begin 
      (q 'enqueue! (left node))   ;; left tree to q 
      (output 'enqueue! (label(left node))) ;; Output root of left tree 
      (q 'enqueue! (right node))   ;; Enqueue right tree to q 
      (output 'enqueue! (label(right node))) ;; Output root of right tree 
     )) 
     (helper (q 'dequeue!))    ;; Dequeues 1st element in q 
              ;; and recursively calls helper 
    ) 
    ) 
) 

(define (make-queue) 
    (let ((front '()) 
     (back '())) 
    (lambda (msg . obj) 
     (cond ((eq? msg 'empty?) (null? front)) 
      ((eq? msg 'enqueue!) 
      (if (null? front) 
       (begin 
        (set! front obj) 
        (set! back obj)) 
       (begin 
        (set-cdr! back obj) 
        (set! back obj)))) 
      ((eq? msg 'dequeue!) 
      (begin 
       (let ((val (car front))) 
       (set! front (cdr front)) 
       val))) 
      ((eq? msg 'queue->list) front))))) 
(define q (make-queue)) 
(define output (make-queue)) 

(define tree '(A (B C D)(E (F G H) I))) 

--------------------------------------------------------- 
Welcome to DrScheme, version 4.2.2 [3m]. 
Language: R5RS; memory limit: 128 megabytes. 
> (breadth tree) 
(a b e b e c d f i c d f i g h g h) ;; Should be (a b e c d f i g h) 
> 

답변

1

가 숙제입니다 때문에, 난 그냥 힌트를 줄 것이다 : 인수를 취하지하는 helper를 다시 작성합니다.