数据结构编程实践20讲(Python版)—06二叉搜索树

本文目录

    • 06 二叉搜索树(Binary Search Tree,BST)
      • S1 说明
      • S2 示例
      • S3 问题: 在线图书馆系统
        • Python3程序
        • 代码说明
      • S4 问题: 学生成绩管理系统
        • Python3程序
        • 代码说明
      • S5 问题: 单词频率统计系统
        • Python3程序
        • 代码说明

往期链接

01 数组02 链表03 栈04 队列05 二叉树

06 二叉搜索树(Binary Search Tree,BST)

S1 说明

二叉搜索树是一种特殊的二叉树,具有以下性质:

  • 节点的值:每个节点的值大于其左子树中所有节点的值,并小于其右子树中所有节点的值。
  • 递归性质:左右子树也是二叉搜索树。

二叉搜索树的主要操作:

插入:在树中插入新节点时,从根节点开始,按照 BST 的性质找到合适的位置。
查找:从根节点开始,比较目标值与当前节点的值,决定向左子树或右子树继续查找。
删除:有三种情况:

  • 删除的节点是叶子节点。
  • 删除的节点只有一个子节点。
  • 删除的节点有两个子节点(需找到右子树的最小值或左子树的最大值替代)。

应用场景:

查找表:可以用作实现高效的查找表。
数据库索引:许多数据库使用 BST 或其变种(如 B 树)来实现索引。
自动排序:可以通过中序遍历得到一个有序序列。
动态集合:支持动态插入和删除的集合操作。
区间查询:可以快速查找某个值是否在特定范围内。
图形算法:在某些图形算法(如可视化或图形处理)中需要快速查找。

S2 示例

class TreeNode:def __init__(self, value):self.value = valueself.left = Noneself.right = Noneclass BinarySearchTree:def __init__(self):self.root = Nonedef insert(self, value):if not self.root:self.root = TreeNode(value)else:self._insert_recursive(self.root, value)def _insert_recursive(self, node, value):if value < node.value:if node.left is None:node.left = TreeNode(value)else:self._insert_recursive(node.left, value)else:if node.right is None:node.right = TreeNode(value)else:self._insert_recursive(node.right, value)def search(self, value):return self._search_recursive(self.root, value)def _search_recursive(self, node, value):if node is None or node.value == value:return nodeif value < node.value:return self._search_recursive(node.left, value)return self._search_recursive(node.right, value)# 示例使用
if __name__ == "__main__":bst = BinarySearchTree()numbers = [7, 3, 9, 1, 5, 8, 10]for num in numbers:bst.insert(num)# 查找print(bst.search(5))  # 输出节点对象print(bst.search(6))  # 输出 None

S3 问题: 在线图书馆系统

利用二叉搜索树来实现动态查找和范围查询。构建有一个在线图书馆系统,用户可以通过书名快速查找书籍,并支持查找特定范围内的书籍价格。我们可以使用二叉搜索树来存储书籍信息(如书名和价格),以便高效地进行查找和范围查询。

Python3程序
class Book:def __init__(self, title, price):self.title = titleself.price = priceclass TreeNode:def __init__(self, book):self.book = bookself.left = Noneself.right = Noneclass BookBST:def __init__(self):self.root = Nonedef insert(self, book):if not self.root:self.root = TreeNode(book)else:self._insert_recursive(self.root, book)def _insert_recursive(self, node, book):if book.title < node.book.title:if node.left is None:node.left = TreeNode(book)else:self._insert_recursive(node.left, book)else:if node.right is None:node.right = TreeNode(book)else:self._insert_recursive(node.right, book)def search(self, title):return self._search_recursive(self.root, title)def _search_recursive(self, node, title):if node is None or node.book.title == title:return nodeif title < node.book.title:return self._search_recursive(node.left, title)return self._search_recursive(node.right, title)def range_query(self, low, high):result = []self._range_query_recursive(self.root, low, high, result)return resultdef _range_query_recursive(self, node, low, high, result):if node:if low < node.book.title:self._range_query_recursive(node.left, low, high, result)if low <= node.book.title <= high:result.append(node.book)if high > node.book.title:self._range_query_recursive(node.right, low, high, result)# 示例使用
if __name__ == "__main__":library = BookBST()library.insert(Book("Harry Potter", 20))library.insert(Book("The Hobbit", 15))library.insert(Book("1984", 10))library.insert(Book("War and Peace", 25))library.insert(Book("Pride and Prejudice", 18))# 查找特定书籍book = library.search("1984")if book:print(f"Found: {book.book.title}, Price: ${book.book.price}")else:print("Book not found.")# 范围查询print("Books in the price range 15 to 20:")for b in library.range_query("15", "20"):print(f"{b.title}: ${b.price}")

输出

Found: 1984, Price: $10
Books in the price range 15 to 20:
1984: $10
代码说明
  • Book 类:表示书籍,包含书名和价格。
  • TreeNode 类:表示二叉搜索树的节点,包含书籍信息和指向左右子节点的指针。
  • BookBST 类:实现了二叉搜索树的功能,包括插入、查找和范围查询。

S4 问题: 学生成绩管理系统

Python3程序
class Student:def __init__(self, name, score):self.name = nameself.score = scoreclass TreeNode:def __init__(self, student):self.student = studentself.left = Noneself.right = Noneclass StudentBST:def __init__(self):self.root = Nonedef insert(self, student):if not self.root:self.root = TreeNode(student)else:self._insert_recursive(self.root, student)def _insert_recursive(self, node, student):if student.score < node.student.score:if node.left is None:node.left = TreeNode(student)else:self._insert_recursive(node.left, student)else:if node.right is None:node.right = TreeNode(student)else:self._insert_recursive(node.right, student)def search(self, name):return self._search_recursive(self.root, name)def _search_recursive(self, node, name):if node is None:return Noneif node.student.name == name:return nodeleft_result = self._search_recursive(node.left, name)if left_result:return left_resultreturn self._search_recursive(node.right, name)def range_query(self, low, high):result = []self._range_query_recursive(self.root, low, high, result)return resultdef _range_query_recursive(self, node, low, high, result):if node:if low < node.student.score:self._range_query_recursive(node.left, low, high, result)if low <= node.student.score <= high:result.append(node.student)if high > node.student.score:self._range_query_recursive(node.right, low, high, result)if __name__ == "__main__":bst = StudentBST()bst.insert(Student("张仪", 85))bst.insert(Student("李耳", 70))bst.insert(Student("王叁", 90))bst.insert(Student("赵武", 60))bst.insert(Student("刘流", 75))student = bst.search("王叁")if student:print(f"找到: {student.student.name}, 分数: {student.student.score}")else:print("没找到学生")print("分数在70到85之间的学生及成绩:")for s in bst.range_query(70, 85):print(f"{s.name}: {s.score}")

输出

找到: 王叁, 分数: 90
分数在7085之间的学生及成绩:
李耳: 70
刘流: 75
张仪: 85
代码说明

Student 类:
代表一个学生,包含姓名(name)和分数(score)两个属性。
TreeNode 类:
表示二叉搜索树的一个节点,包含一个 Student 对象和指向左右子节点的引用。
StudentBST 类:
实现了二叉搜索树的主要功能,包括插入、搜索和范围查询。
主要方法:

  • insert: 插入新的学生记录
  • search: 根据姓名查找学生
  • range_query: 查找特定分数范围内的学生

S5 问题: 单词频率统计系统

Python3程序
class WordFrequency:def __init__(self, word, frequency):self.word = wordself.frequency = frequencyclass TreeNode:def __init__(self, word_freq):self.word_freq = word_freqself.left = Noneself.right = Noneclass WordFrequencyBST:def __init__(self):self.root = Nonedef insert(self, word):if not self.root:self.root = TreeNode(WordFrequency(word, 1))else:self._insert_recursive(self.root, word)def _insert_recursive(self, node, word):if word == node.word_freq.word:node.word_freq.frequency += 1elif word < node.word_freq.word:if node.left is None:node.left = TreeNode(WordFrequency(word, 1))else:self._insert_recursive(node.left, word)else:if node.right is None:node.right = TreeNode(WordFrequency(word, 1))else:self._insert_recursive(node.right, word)def search(self, word):return self._search_recursive(self.root, word)def _search_recursive(self, node, word):if node is None or node.word_freq.word == word:return nodeif word < node.word_freq.word:return self._search_recursive(node.left, word)return self._search_recursive(node.right, word)def inorder_traversal(self):result = []self._inorder_recursive(self.root, result)return resultdef _inorder_recursive(self, node, result):if node:self._inorder_recursive(node.left, result)result.append(node.word_freq)self._inorder_recursive(node.right, result)# 使用示例
if __name__ == "__main__":bst = WordFrequencyBST()# 插入单词text = "the quick brown fox jumps over the lazy dog"for word in text.split():bst.insert(word.lower())# 查询特定单词的频率word_to_search = "the"result = bst.search(word_to_search)if result:print(f"'{word_to_search}' appears {result.word_freq.frequency} times.")else:print(f"'{word_to_search}' not found.")# 打印所有单词及其频率print("\nAll words and their frequencies:")for word_freq in bst.inorder_traversal():print(f"{word_freq.word}: {word_freq.frequency}")

输出

'the' appears 2 times.All words and their frequencies:
brown: 1
dog: 1
fox: 1
jumps: 1
lazy: 1
over: 1
quick: 1
the: 2
代码说明

WordFrequency 类: 存储单词及其频率。
-TreeNode 类: 表示二叉搜索树的节点。
WordFrequencyBST 类: 实现了二叉搜索树的主要功能。

  • insert 方法:插入新单词或增加已存在单词的频率。
  • search 方法:查找特定单词的频率。
  • inorder_traversal 方法:按字母顺序遍历所有单词及其频率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/442629.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

精品WordPress主题/响应式个人博客主题Kratos

Kratos 是一款专注于用户阅读体验的响应式 WordPress 主题&#xff0c;整体布局简洁大方&#xff0c;针对资源加载进行了优化。 Kratos主题基于Bootstrap和Font Awesome的WordPress一个干净&#xff0c;简单且响应迅速的博客主题&#xff0c;Vtrois创建和维护&#xff0c; 主…

LeetCode 刷题基础 -- 模板原型Ⅰ

模板原型 - 基础篇 学习网站一、进制转换二、二分查找① 查找指定元素② 查找第一个大于等于 x 值的序列下标③ 查找第一个大于 x 值的序列下标④ 单峰序列 三、双指针① 两数之和② 序列合并③ 集合求交④ 集合求并 四、其他高效技巧与算法① 区间和② 01 对③ 左小数 五、数学…

BLE MESH学习1-基于沁恒CH582学习

BLE MESH学习1-基于沁恒CH582学习 一、BLE mesh说明 mesh组网可以实现相比点对点模式更远的距离、更灵活的网络形式、更可靠的连接和更多的设备加入。BLE mesh在IoT中的传感器和控制具有重要意义。我的目的也是IoT领域&#xff0c;实现自己的传感器读取、开关控制等类似米家智…

知识改变命运 数据结构【java对象的比较】

0&#xff1a;前言 在基本数据类型中&#xff0c;我们可以直接使用号比较是否相等&#xff0c;还记的学堆哪里时候&#xff0c;插入一个数据&#xff0c;就会与其他数据进行比较&#xff0c;当时我们传入的是Integer类型&#xff0c;在Integer类里面已经实现了compare。 如果…

西门子S7-1200博途软件项目的下载

S7-1200的CPU本体上集成了PROFINET通信口&#xff0c;通过这个通信口可以实现CPU与编程设备的通信。 此外&#xff0c;S7-1200 可以通过连接CM1243-5扩展模块&#xff0c;然后电脑通过PC ADAPTER USB A2电缆、或者电脑上的CP卡&#xff08;例如CP5612&#xff09;通过PROFIBUS…

手写mybatis之SQL执行器的定义和实现

前言 所有系统的设计和实现&#xff0c;核心都在于如何解耦&#xff0c;如果解耦不清晰最后直接导致的就是再继续迭代功能时&#xff0c;会让整个系统的实现越来越臃肿&#xff0c;稳定性越来越差。而关于解耦的实践在各类框架的源码中都有非常不错的设计实现&#xff0c;所以阅…

陪伴系统,会成为女性向游戏的下一个争夺点吗?

乙游提供给女性玩家的只有恋爱感吗&#xff1f; 一般来说&#xff0c;对于乙女游戏的概括常常以为玩家提供“恋爱陪伴感”为主&#xff0c;恋爱很好理解&#xff0c;通过与多位男主角的剧情互动来模拟在真实恋爱中的情感交互&#xff0c;当下乙游都将重点放在了营造恋爱感上。…

55页可编辑PPT | 制造企业数字化转型顶层规划案例

基于集团的战略和运营特点&#xff0c;数字化转型应如何考虑&#xff1f; 在集团的战略和运营特点基础上进行数字化转型&#xff0c;需要实现业务多元化&#xff0c;整合资源和流程&#xff0c;推动国际化拓展&#xff0c;实施差异化战略&#xff0c;并通过数据驱动决策&#…

Vue工程化结构环境安装及搭建教程 : 之nvm

vue需要的环境&#xff1a; node.js : Node.js和Vue.js通常会一起使用。Node.js作为后端服务器&#xff0c;处理服务器端的逻辑和数据访问&#xff0c;而Vue.js则负责前端用户界面的构建和交互。通过Ajax通信&#xff0c;Vue.js应用程序向Node.js服务器发送请求&#xff0c;并…

【Ubuntu】git

文章目录 1.配置SSH key2. 基础知识操作命令1分支branch 如果对git命令使用不熟悉&#xff0c;推荐一个非常棒的git在线练习工具 Learn Git Branching。 https://m.runoob.com/git/git-basic-operations.html 1.配置SSH key ssh-keygen -t rsa -C "YOUR EMAIL"完成…

PDF无法导出中文

font/SIMSUN.TTC with Identity-H is not recognized. 查看BaseFont源码发现".ttc," 改为"SIMSUN.TTC,a"提示数字转换异常 改为"SIMSUN.TTC,11"提示数字索引必须介于0和1之间 改为0或1结果正常 BaseFont baseFont BaseFont.createFont("/U…

迎接国庆旅游热潮,火山引擎数据飞轮助力景区数智化升级

随着人们生活水平的提高和旅游消费观念的转变&#xff0c;国庆假期成为人们出行旅游的黄金时段。同程旅行发布的报告显示&#xff0c;北京、杭州、重庆、上海、南京、成都等城市仍是 “十一” 假期国内热门的目的地&#xff0c;而一些新兴的宝藏旅游目的地如新疆阿勒泰、云南迪…

四.python核心语法

目录 1.序列 1.1. 索引 1.2. 切片 1.3. 总结 2.加法和乘法 2.1. 加法 2.2. 乘法 3.常用函数 3.1.sum()函数 3.2.max()函数和min()函数 3.3.len()函数 4. list 列表 [ ] 基本操作 4.1. 列表的定义 4.2. 列表的创建&#xff08;list()函数&#xff09; 4.3. 列表的…

RabbitMQ概述

什么是MQ MQ (message queue)消息队列 MQ从字⾯意思上看,本质是个队列,FIFO先⼊先出&#xff0c;只不过队列中存放的内容是消息(message).消息可以⾮常简单,⽐如只包含⽂本字符串,JSON等,也可以很复杂,⽐如内嵌对象 RabbitMQ是MQ的一种实现,是Rabbit 企业下的⼀个消息队列产…

Python 如何使用 scikit-learn 进行模型训练

如何使用 scikit-learn 进行模型训练 一、简介 在现代的数据科学和机器学习领域&#xff0c;Python 已经成为最流行的编程语言之一。而其中最流行的机器学习库之一就是 scikit-learn。scikit-learn 提供了许多方便的工具和函数来实现常见的机器学习任务&#xff0c;包括数据预…

数据分析:宏基因组群落TOPOSCORE拓扑结构打分

文章目录 介绍数据TOPOSCORE算法SCORE计算TOPOSCORE实操tp_helper.R导入数据生存分析Fisher精确检验聚类分析SIG定义Toposcoring 分数计算Akkermansia muciniphila的考虑TOPOSCORE的验证总结系统信息介绍 研究背景:肠道微生物群对癌症患者对免疫检查点抑制剂(ICIs)的临床反…

笔记整理—linux进程部分(9)互斥锁

互斥锁也叫互斥量&#xff0c;可以看作一种特殊的信号量。信号量可以>0&#xff0c;大家可以排队使用信号量&#xff0c;互斥锁只有0、1&#xff0c;主要实现关键段保护&#xff0c;只能在某一时间给某一任务去调用这段资源&#xff0c;这段内容用之前上锁&#xff0c;用完时…

【stm32】寄存器(stm32技术手册下载链接)

1、资料下载 RM0008_STM32F101xx,STM32F102xx,STM32F103xx,STM32F105xx和STM32F107xx单片机参考手册 | STMCU中文官网 2、代码 设置PB7 //设置PB7 #define SDA_IN() {GPIOB->CRL&0X0FFFFFFF;GPIOB->CRL|(u32)8<<28;} #define SDA_OUT() {GPIOB->…

STM32编码器接口

一、概述 1、Encoder Interface 编码器接口概念 编码器接口可接收增量&#xff08;正交&#xff09;编码器的信号&#xff0c;根据编码器旋转产生的正交信号脉冲&#xff0c;自动控制CNT自增或自减&#xff0c;从而指示编码器的位置、旋转方向和旋转速度每个高级定时器和通用…

基于VUE+uniapp小程序的物业管理系统社区小区物业报修收费投诉管理系统

&#xff01;&#xff01;&#xff01;页面底部,文章结尾,加我好友,获取计算机毕设开发资料 目录 一、引言 二、相关技术介绍 三、系统需求分析 四、系统设计 五、关键技术实现 六、测试与优化 七、总结与展望 一、引言 当前物业管理存在诸多问题&#xff0c;如报修响应…