《计算机程序的构造与解释》(九)

来源:互联网 发布:知我者希 则我者贵 编辑:程序博客网 时间:2024/05/09 00:49

集合作为二叉树

二叉树的每个节点都由一个表来表示,这个表包含三个元素:本节点的元素、左子树和右子树。并且有三个选择函数:entry、left-branch、right-branch;一个构造函数make-tree。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;(define (entry tree) (car tree))(define (left-branch tree) (cadr tree))(define (right-branch tree) (caddr tree))(define (make-tree entry left right)    (list entry left right))
通过上面的四个过程,可以进一步定义二叉树操作如:判断某元素是否为树节点element-of-set?;添加元素adjoin-set。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;(define (element-of-set? x set)    (cond ((null? set) false)          ((= x (entry set)) true)          ((< x (entry set))           (element-of-set? x (left-branch set)))          ((> x (entry set))           (element-of-set? x (right-branch set)))));;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;(define (adjoin-set x set)    (cond ((null? set) (make-tree x '() '()))          ((= x (entry set)) set)          ((< x (entry set))           (make-tree (entry set)                      (adjoin-set x (left-branch set))                      (right-branch set)))          ((> x (entry set))           (make-tree (entry set)                      (left-branch set)                      (adjoin-set x (right-branch set))))))(adjoin-set 2 (adjoin-set 3 (adjoin-set 4 (adjoin-set 1 mTree))));;=>'(1 () (4 (3 (2 () ()) ()) ()))(element-of-set? 5 '(1 () (4 (3 (2 () ()) ()) ())));;=>#f(element-of-set? 4 '(1 () (4 (3 (2 () ()) ()) ())));;=>#t

将二叉树集合转换成表:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;(define (tree2list tree)    (cond ((null? tree) null)          (else (append (tree2list (left-branch tree))                        (cons (entry tree)                              (tree2list (right-branch tree)))))))(define mTree    (adjoin-set 5 (adjoin-set 6 (adjoin-set (adjoin-set 8 (adjoin-set 2 '()))))))mTree;;=>'(2 () (8 (3 () (6 (5 () ()) ())) ()))(tree2list mTree);;=>'(2 3 5 6 8)



0 0
原创粉丝点击