Scheme 方案中的广度优先二叉树遍历

Scheme 方案中的广度优先二叉树遍历,scheme,queue,binary-tree,Scheme,Queue,Binary Tree,我正在尝试实现广度优先(level)树遍历。我很接近,但我不知道我是如何得到复制品的。非常感谢您的帮助。提前谢谢。 JR 既然这是家庭作业,我就给你一个提示:重写helper不带任何参数 (define (atom? x) (not (pair? x))) ;;Functions to manipulate a binary tree (define (leaf? node) (atom? node)) (define (left node) (cadr node)) (define (r

我正在尝试实现广度优先(level)树遍历。我很接近,但我不知道我是如何得到复制品的。非常感谢您的帮助。提前谢谢。 JR


既然这是家庭作业,我就给你一个提示:重写
helper
不带任何参数

(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)
>