Это было весело!
Хорошо, я действительно надеюсь, что это не домашняя работа.
Оказывается, есть очень простое рекурсивное решение.На каждом уровне вам нужно взять список деревьев, собрать их по парам в более глубокие деревья, а затем добавить новые листья на этом уровне.Это может быть написано с использованием 'foldr', но я подумал, что это будет немного менее понятно.
Я должен немного уточнить ввод;на странице, которую вы упоминаете, спецификации выглядят как
листья на уровне 0:
листья на уровне 1:
листья на уровне 2: x23, x42, x23
листья на уровне 3:x24, x23
Это будет соответствовать входному значению
'(() () (x23 x42 x23) (x24 x23))
для указанной ниже программы.
Кроме того, здесь происходит только отображение этой таблицы в двоичном дереве, которое будет полезно только при декодировании.Для кодирования это двоичное дерево будет бесполезно.
Наконец, большой привет Как разрабатывать программы ;Я внимательно следил за рецептом дизайна, расставляя все свои я и пересекая все свои.Сначала тестируйте, пожалуйста!
Приветствия!
Джон Клементс
#lang racket
(require rackunit)
;; a tree is either
;; a symbol, or
;; (list tree tree)
;; a specification is
;; (listof (listof symbol))
;; spec->tree : specification -> tree
;; run spec->treelist, ensure that it's a list of length 1, return it.
(define (spec->tree spec)
(match (spec->treelist spec)
[(list tree) tree]
[other (error 'spec->tree "multiple trees produced")]))
;; spec->treelist : specification -> (listof tree)
;; given a *legal* specification, produce
;; the corresponding tree. ONLY WORKS FOR LEGAL SPECIFICATIONS...
(define (spec->treelist spec)
(cond [(empty? spec) empty]
[else (append (first spec) (gather-pairs (spec->treelist (rest spec))))]))
;; go "up one level" by grouping each pair of trees into one tree.
;; The length of the list must be a number divisible by two.
(define (gather-pairs trees)
(match trees
[(list) empty]
[(list-rest a b remaining) (cons (list a b) (gather-pairs remaining))]
[other (error 'gather "improperly formed specification")]))
;; TEST CASES
(check-equal? (gather-pairs '(a b c d)) '((a b) (c d)))
(check-equal? (spec->treelist '((top))) '(top))
(check-equal? (spec->treelist '(() (two-a two-b))) '((two-a two-b)))
(check-equal? (spec->treelist '(() (two-a) (three-a three-b)))
'((two-a (three-a three-b))))
(check-equal? (spec->treelist '(() () (three-a three-b three-c) (four-a four-b)))
'(((three-a three-b) (three-c (four-a four-b)))))
(check-equal? (spec->tree '(() () (three-a three-b three-c) (four-a four-b)))
'((three-a three-b) (three-c (four-a four-b))))