集合作为二叉树
二叉树的每个节点都由一个表来表示,这个表包含三个元素:本节点的元素、左子树和右子树。并且有三个选择函数: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)