当前位置: 首页 > article >正文

sicp每日一题[2.65]

Exercise 2.65

Use the results of Exercise 2.63 and Exercise 2.64 to give (n) implementations of union-set and intersection-set for sets implemented as (balanced) binary trees.


这道题难度还是挺大的,一开始我不知道怎么直接对2颗树求交集和并集,而且要在 O(n) 的时间复杂度内。上网看了一下别人的答案,发现他们都是先用 2.63 的 tree->list-2 把树转为列表,然后再求交集并集,最后再用 2.64 的 list->tree 把结果转成树结构。
这样我就明白怎么做了,尤其是求并集可以直接参考 2.62 的答案,但是稍作修改,让它能去除重复元素,求交集虽然没有现成的,但是参考并集的方法也不难。

(define (union-tree tree1 tree2) 
  (define (union-set set1 set2) 
    (cond ((null? set2) set1) 
          ((null? set1) set2)
          (else (let ((s1 (car set1))
                      (s2 (car set2)))
                  (cond ((= s1 s2) (cons s1 (union-set (cdr set1) (cdr set2))))
                        ((< s1 s2) (cons s1 (union-set (cdr set1) set2)))
                        (else (cons s2 (union-set set1 (cdr set2)))))))))
  (list->tree (union-set (tree->list-2 tree1) (tree->list-2 tree2))))
  
(define (intersection-tree tree1 tree2) 
  (define (intersection-set set1 set2) 
    (if (or (null? set1) (null? set2))
        '()
        (let ((s1 (car set1))
              (s2 (car set2)))
          (cond ((= s1 s2) (cons s1 (intersection-set (cdr set1) (cdr set2))))
                ((< s1 s2) (intersection-set (cdr set1) set2))
                (else (intersection-set set1 (cdr set2)))))))
  (list->tree (intersection-set (tree->list-2 tree1) (tree->list-2 tree2)))) 


(define tree1 (list->tree (list 1 3 5 7 9 11)))
(define tree2 (list->tree (list 2 4 6 7 8 9 10)))

(intersection-tree tree1 tree2)
(union-tree tree1 tree2)

; 结果如下
'(7 () (9 () ()))
'(6 (3 (1 () (2 () ())) (4 () (5 () ()))) (9 (7 () (8 () ())) (10 () (11 () ()))))

http://www.kler.cn/a/378694.html

相关文章:

  • PHP JSON 教程
  • [neo4j报错]py2neo.errors.ClientError: [Request.Invalid] Not Found解决方案
  • 数据结构之线段树
  • (蓝桥杯C/C++)—— 编程基础
  • 自适应对话式团队构建,提升语言模型代理的复杂任务解决能力
  • 上市公司环境信息披露质量评分数据王婉菁版(2008-2023年)噪声光污染辐射废水减排等治理
  • 【D3.js in Action 3 精译_039】4.3 D3 面积图的绘制方法及其边界标签的添加
  • RTP和RTCP的详细介绍及其C代码示例
  • UG NX二次开发(C#)-UFun-创建草图和草图曲线
  • Redis设计与实现 学习笔记 第十四章 服务器
  • RSTP的工作过程
  • CentOS 9 Stream 上安装 Redis
  • 从事人工智能相关岗位需要具备哪些技能?
  • 交叉编译工具链命名规则、以及如何生成交叉编译工具链步骤
  • bash: git: command not found
  • SpringBoot源码(四):run() 方法解析(一)
  • 微服务架构面试内容整理-微服务与传统单体架构的区别
  • 在麒麟V10上下载pycharm
  • Pinctrl子系统中client端设备树相关数据结构介绍和解析
  • 【双目视觉标定】——1原理与实践
  • XSS跨站脚本攻击的实现原理及讲解
  • 第三百零八节 Log4j教程 - Log4j日志到数据库
  • 江协科技STM32学习- P35 硬件I2C读写MPU6050
  • NFTScan Site:以蓝标认证与高级项目管理功能赋能 NFT 项目
  • lua学习笔记---面向对象
  • NVR批量管理软件/平台EasyNVR多个NVR同时管理支持对接阿里云、腾讯云、天翼云、亚马逊S3云存储