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

本文介绍了一种使用二叉树实现集合的数据结构方法,包括如何通过递归方式实现元素查找(element-of-set?)与添加(adjoin-set)操作,并展示了如何将二叉树转换为列表形式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集合作为二叉树

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值