4 (define (make-leaf leaf weight)
5 (list 'leaf leaf weight))
8 (eq? (car object) 'leaf))
10 (define (symbol-leaf object)
13 (define (weight-leaf object)
16 ;;;; constructors and selectors
18 ;; tree node consists of a list which has left branch, right branch
19 ;; set of symbols in left and right and total weight
20 (define (make-code-tree left right)
23 (append (symbols left)
28 (define (left-branch tree) (car tree))
30 (define (right-branch tree) (cadr tree))
32 (define (symbols tree)
34 (list (symbol-leaf tree))
43 (define (decode bits tree)
44 (define (decode-1 bits current-branch)
47 (let ([next-branch (choose-branch (car bits) current-branch)])
48 (if (leaf? next-branch)
49 (cons (symbol-leaf next-branch)
50 (decode-1 (cdr bits) tree))
51 (decode-1 (cdr bits) next-branch)))))
54 (define (choose-branch bit tree)
55 (cond [(= bit 0) (left-branch tree)]
56 [(= bit 1) (right-branch tree)]
57 [else (error "Bad bit -- CHOOSE-BRANCH" bit)]))
59 (define (adjoin-set x set)
60 (cond [(null? set) (list x)]
61 [(< (weight x) (weight (car set))) (cons x set)]
63 (adjoin-set x (cdr set)))]))
65 (define (make-leaf-set pairs)
68 (let ([pair (car pairs)])
69 (adjoin-set (make-leaf (car pair)
71 (make-leaf-set (cdr pairs))))))
73 (provide make-code-tree