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

news2024/10/8 19:53:27

本文目录

    • 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 = value
        self.left = None
        self.right = None

class BinarySearchTree:
    def __init__(self):
        self.root = None

    def 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 node
        if 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 = title
        self.price = price

class TreeNode:
    def __init__(self, book):
        self.book = book
        self.left = None
        self.right = None

class BookBST:
    def __init__(self):
        self.root = None

    def 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 node
        if 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 result

    def _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 = name
        self.score = score

class TreeNode:
    def __init__(self, student):
        self.student = student
        self.left = None
        self.right = None

class StudentBST:
    def __init__(self):
        self.root = None

    def 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 None
        if node.student.name == name:
            return node
        left_result = self._search_recursive(node.left, name)
        if left_result:
            return left_result
        return self._search_recursive(node.right, name)

    def range_query(self, low, high):
        result = []
        self._range_query_recursive(self.root, low, high, result)
        return result

    def _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 = word
        self.frequency = frequency

class TreeNode:
    def __init__(self, word_freq):
        self.word_freq = word_freq
        self.left = None
        self.right = None

class WordFrequencyBST:
    def __init__(self):
        self.root = None

    def 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 += 1
        elif 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 node
        if 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 result

    def _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.coloradmin.cn/o/2197110.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

众数信科AI智能体智慧文旅解决方案——智能旅行助手

智慧文旅解决方案 智能旅行助手方案 利用先进的AI算法 提供个性化旅游体验的智能服务 众数信科AI智能体 产品亮点 旅游路线智能规划 旅游景点智能问答 旅行游记智能生成等 构建旅行实用指南 让旅游更加便捷、高效、智能化 关于我们 众数信科成立于2021年&#xff0c;由…

操作系统 | 学习笔记 | 王道 | 4.1 文件系统基础

4.文件管理 4.1 文件系统基础 4.1.1 文件的基本概念 定义 文件是以计算机硬盘为载体的存储在计算机上的信息集合&#xff0c;在用户进行的输入、输出中&#xff0c;以文件位基本单位。 文件管理系统是实现的文件的访问、修改和保存&#xff0c;对文件维护管理的系统。 文件的…

Ngx+Lua+Redis 快速存储POST数据

系统几万台设备有windows有安卓还有linux系统&#xff0c;每个设备三分钟就会向服务器post设备的硬件信息&#xff0c;数据格式json&#xff0c;后台管理界面只需要最新的数据&#xff0c;不需要历史数据&#xff0c;业务逻辑非常简单&#xff0c;PHP代码就几行&#xff0c;已经…

Python selenium库学习使用实操四

系列文章目录 Python selenium库学习使用实操 Python selenium库学习使用实操二 Python selenium库学习使用实操三 文章目录 系列文章目录[TOC](文章目录) 前言一、元素获取二、选项解析总结 前言 在Python selenium库学习使用实操二中提到了下拉框的操作&#xff0c;一种是标…

Redis持久化机制(RDBAOF详解)

目录 一、Redis持久化介绍二、Redis持久化方式1、RDB持久化(1) 介绍(2) RDB持久化触发机制(3) RDB优点和缺点(4) RDB流程 2、AOF(append only file)持久化(1) 介绍(2) AOF优点和缺点(3) AOF文件重写(4) AOF文件重写流程 三、AOF和RDB持久化注意事项 一、Redis持久化介绍 Redis…

YOLOv5复现(论文复现)

YOLOv5复现&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 文章目录 YOLOv5复现&#xff08;论文复现&#xff09;概述模型结构正负样本匹配策略损失计算数据增强使用方式训练测试验证Demo 概述 YOLOv5是由Ultralytics公司于2020年6月开源的目标检…

uniapp顶部提示栏实现

效果&#xff1a; 用途&#xff1a;用于展示较短系统通知 实现逻辑&#xff1a; 1.通过请求获取该显示的通知内容&#xff0c;目前所考虑的字段有&#xff1a; {id: 200, // 通知标识&#xff0c;后续会用其阻止用户关闭后无休止开启message: "请勿以系统规定的其它…

与ZoomEye功能类似的搜索引擎还有哪些?(渗透课作业)

与ZoomEye功能类似的搜索引擎有&#xff1a; Shodan&#xff1a;被誉为“物联网的搜索引擎”&#xff0c;专注于扫描和索引连接到互联网的各种设备&#xff0c;如智能家居设备、工业控制系统、摄像头、数据库等。它提供全球互联网设备的可视化视图&#xff0c;帮助用户了解网络…

ssm图书管理系统的设计与实现

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 摘 要 I Abstract II 第1章 绪论 1 1.1 课题研究背景 1 1.2课题研究现状 1 1.3课题实现目的和意义 …

【C++】模拟实现hash_table(哈希表)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目功能 二.逐步实现项目功能模块及其逻辑详解 &#x1f4cc;实现HashNode类模板 &#x1f38f;构造HashNode类成员变量 &#x1f38f;实现HashNode类构造函数…

高效研究:Zotero的7个插件让你事半功倍

还在为海量文献管理头疼吗?还在为找不到合适的插件犯愁吗?别急,今天我就要带你解锁Zotero的终极武器 - 那些让你爱不释手的必备插件! 作为一个从小白到文献管理达人的过来人,我可以负责任地说:没有这些插件,你的Zotero只能发挥一半功力!安装了这些插件,你的效率绝对能飙升! …

字典树(单词查找树、Trie树)

题目 代码 #include <bits/stdc.h> using namespace std; const int N 1e510; int f[N][26], idx, cnt[N]; void insert(char str[]) {int p 0;for(int i 0; str[i]; i){int u str[i] - a;if(!f[p][u]) f[p][u] idx;p f[p][u];}cnt[p]; } int query(char str[]) …

相亲交友系统的商业模式探讨

在撰写关于相亲交友系统的商业模式探讨时&#xff0c;附带示例代码可能不太合适&#xff0c;因为软文通常是面向非技术读者&#xff0c;讲述商业模式、用户体验等方面的内容。不过&#xff0c;为了满足您的需求&#xff0c;我可以尝试结合一些简单的伪代码&#xff08;模拟代码…

CSS 3D转换

在 CSS 中&#xff0c;除了可以对页面中的元素进行 2D 转换外&#xff0c;您也可以对象元素进行 3D转换&#xff08;将页面看作是一个三维空间来对页面中的元素进行移动、旋转、缩放和倾斜等操作&#xff09;。与 2D 转换相同&#xff0c;3D 转换同样不会影响周围的元素&#x…

Cursor编辑器:10秒生成完美Git提交信息!

Cursor编辑器&#xff1a;10秒生成完美Git提交信息&#xff01; 亲爱的开发者们&#xff0c;是否还在为编写规范的Git提交信息而头疼&#xff1f;今天&#xff0c;就让我们一起揭开Cursor编辑器的神秘面纱&#xff0c;探索如何一键生成专业的Git Commit Message&#xff0c;让…

Android 电源管理各个版本的变动和限制

由于Android设备的电池容量有限&#xff0c;而用户在使用过程中会进行各种高耗电操作&#xff0c;如网络连接、屏幕亮度调节、后台程序运行等&#xff0c;因此需要通过各种省电措施来优化电池使用‌&#xff0c;延长电池续航时间&#xff0c;提高用户体验&#xff0c;并减少因电…

数据结构-八大排序之堆排序

堆排序 1.1 基础知识 原理&#xff1a; 1. 利用完全二叉树构建大顶堆 2. 堆顶元素和堆底元素进行交换&#xff0c;除堆底元素之外其余元素继续构建大顶堆 3. 重复2&#xff0c;直到所有元素都不参与构建 整个数组排序完成 完全二叉树&#xff1a; 数据从上到下&#x…

八大排序--05堆排序

假设数组 arr[] {5,7,4,2,0,3,1,6},请通过插入排序的方式&#xff0c;实现从小到大排列&#xff1a; 方法&#xff1a;①利用完全二叉树构建大顶堆&#xff1b; ②对顶元素和堆底元素进行交换&#xff0c;除堆底元素之外其余元素继续构造大顶堆&#xff1b; ③重复步骤②&…

2k1000LA iso 镜像的制作

问题: 已经有了buildroot ,内核也调试好了,但是没有loongnix 镜像。 首先是网上下载镜像,看看能不能用 首先是现在 网上的 iso 镜像进行烧写测试。 安装 7z 解压软件 进行U盘的烧写。 进行系统安装测试: <

视频剪辑软件推荐电脑版:这5款剪辑软件不容错过!

在视频剪辑领域&#xff0c;选择合适的软件至关重要。不同的软件各有千秋&#xff0c;有的简单易用&#xff0c;适合新手快速上手&#xff1b;有的功能强大&#xff0c;适合专业团队进行深度编辑。以下是一些电脑版视频剪辑软件的推荐&#xff0c;涵盖了从新手到专业级别的不同…