Python 二叉搜索树

article/2025/8/25 1:09:04

二叉搜索树(BST),有时也被称为二叉排序树,是一种特殊类型的容器: 在内存中存储“项目”(例如数字,名称等)的数据结构。它们允许快速查找、添加和删除项目。二叉排序树是带根结点的二叉树,其内部结点各自存储一个关键字(以及可选的相关值),并且各自具有两个可区分的子树,通常表示为左和右。该树还拥有二分搜索的属性,该属性声明每个结点中的关键字必须大于或等于左子树中存储的任何关键字,并且小于或等于右子树中存储的任何关键字。 树的叶子(最终结点)不包含关键字,也没有结构来区分它们。 

二叉搜索树结构如上图所示。下面将根据二叉搜索树的特点进行插入、查找和删除操作。 

##二叉搜索树
##本代码分别设计了二叉搜索树的插入、查找和删除操作
class ercha_tree():##节点def __init__(self,data):self.data=dataself.lchild=Noneself.rchild=Noneself.parent=Noneclass sousuo():##二叉搜索树创建def __init__(self,li=None):self.root=Noneif li:for val in li:self.insert_2(val)'''def insert(self,node,val):if not node:node=ercha_tree(val)if val < node.data:node.lchild=self.insert(node.lchild,val)node.lchild.parent=nodeelif val > node.data:node.rchild=self.insert(node.rchild,val)node.rchild.parent=nodereturn node'''def insert_2(self,val):##插入p=self.rootif not p:self.root=ercha_tree(val)returnwhile True:if val<p.data:if p.lchild:p=p.lchildelse:p.lchild=ercha_tree(val)p.lchild.parent=preturnelif val>p.data:if p.rchild:p=p.rchildelse:p.rchild=ercha_tree(val)p.rchild.parent=preturn'''def find(self,val):node=self.rootif not node:return Noneif node.data<val:return self.find(node.rchild,val)elif node.data>val:return self.find(node.rchild,val)else:return node.data'''def find_2(self,val):##查找p=self.rootwhile p:if p.data<val:p=p.rchildelif p.data>val:p=p.lchildelse:return preturn Nonedef mid_read(self,root):##中序遍历if root:self.mid_read(root.lchild)print(root.data, end=' ')self.mid_read(root.rchild)def delete_0(self,node):##叶子节点if not node.parent:self.root=Noneif node==node.parent.lchild:node.parent.child=Noneelse:node.parent.rchild=None##删除操作,分三种情况:def delete_1(self,node):##有左孩子if not node.parent:self.root=Noneif node==node.parent.lchild:node.parent.lchild=node.lchildnode.lchild.parent=node.parentelse:node.parent.rchild=node.lchildnode.lchild.parent=node.parentdef delete_2(self, node):##有右孩子if not node.parent:self.root=Noneif node==node.parent.lchild:node.parnent.lchild=node.rchildnode.rchild.parent=node.parentelse:node.parent.rchild=node.rchildnode.rchild.parent=node.parentdef delete(self,val):if not self.find_2(val):return Noneif self.find_2(val):node=self.find_2(val)if not node.lchild and not node.rchild:self.delete_0(node)elif not node.rchild:self.delete_1(node)elif not node.rchild:self.delete_2(node)else:##有左右孩子,寻找左子树的最大值或者右子树的最小值min_node=node.rchildwhile min_node.lchild:min_node=min_node.lchildnode.data=min_node.dataif min_node.rchild:self.delete_2(min_node)else:self.delete_0(min_node)b=sousuo([5,3,4,7,8])
b.mid_read(b.root)
b.delete(3)
print()
b.mid_read(b.root)

结果:

 


http://chatgpt.dhexx.cn/article/flpO85W5.shtml

相关文章

构建二叉搜索树

二叉搜索树 (BST) 递归定义为具有以下属性的二叉树&#xff1a; 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值若它的右子树不空&#xff0c;则右子树上所有结点的值均大于或等于它的根结点的值它的左、右子树也分别为二叉搜索树 给定二叉树的具体…

【Java 数据结构】实现一个二叉搜索树

目录 1、认识二叉搜索树 2、实现一个二叉搜索树 2.1 成员变量 2.2 insert 方法 2.3 search 方法 2.4 remove 方法(重点) 3、二叉搜索树总结 1、认识二叉搜索树 从字面上来看&#xff0c;它只比二叉树多了搜索两个字&#xff0c;我们回想一下&#xff0c;如果要是在二…

java二叉搜索树详解

文章目录 一、概念二、相关操作2.0节点相关代码&#xff1a;2.1查找2.2插入2.3删除&#xff08;重难点&#xff09;2.4测试用例 三、小结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、概念 二叉搜索树又称二叉排序树 它或者是一棵空树&#xff…

二叉搜索树

目录 二叉搜索树二叉搜索树概念 增删查改接口插入递归插入查找递归查找删除递归删除 成员函数拷贝构造拷贝赋值析构 二叉搜索树的应用二叉搜索树的性能分析 二叉搜索树 二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的…

【数据结构】二叉搜索树

目录 一.二叉搜索树规则 二.框架 三.实现 1.查找, 插入, 删除 迭代法实现 递归法实现 2.构造, 赋值 默认构造 拷贝构造 赋值运算符重载 3.中序遍历 四.时间复杂度及稳定性 五.key模型与key/value模型 1.key模型 2.key/value模型 一.二叉搜索树规则 二叉搜索树又…

数据结构——二叉搜索树详解

二叉搜索树 一、什么是二叉搜索树 二叉搜索树&#xff08;BST&#xff0c;Binary Search Tree&#xff09;&#xff0c;也称二叉排序树或二叉查找树。 二叉搜索树&#xff1a;一棵二叉树&#xff0c;可以为空&#xff1b;如果不为空&#xff0c;满足以下性质&#xff1a; 非空…

【数据结构】——二叉搜索树

目录 前言 二叉搜索树的概念 二叉搜索树的操作 树的节点实现 搜索树的基本结构 插入数据 查找 删除 拷贝构造函数 二叉搜索树的应用 前言 在c中的容器里map和set的学习需要二叉搜索树的铺垫&#xff0c;也为后边的的红黑树和AVL树做铺垫&#xff0c;也就是说&#xff0c;…

二叉搜索树(二叉排序树)

一.概念 二叉搜索树又称二叉排序树&#xff0c;具有以下性质&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树 注意&#xff1a;二…

二叉排序树(二叉查找树、二叉搜索树)(图解+完整代码)

目录 ⚽1.什么是二叉排序树 &#x1f3d0;2.构建二叉排序树 &#x1f3c0;3.二叉排序树的查找操作 &#x1f94e;4.二叉排序树的删除 &#x1f3b1;5.完整代码 ⚽1.什么是二叉排序树 我们直接看它的性质&#xff1a; 若它的左子树不空&#xff0c;则左子树上所有结点的值…

种树:二叉树、二叉搜索树、AVL树、红黑树、哈夫曼树、B树、树与森林

虽然今天不是植树节&#xff0c;但是我今天想种树。 文章目录 树&#xff0c;什么是树&#xff1f;二叉树定义二叉树的创建二叉树的前中后序遍历前序遍历&#xff1a;中序遍历后序遍历已知前序、中序遍历结果&#xff0c;还原二叉树已知后序、中序遍历结果&#xff0c;还原二叉…

java lrucache_Java LruCache 的使用及原理

概述 LRU (Least Recently Used) 的意思就是近期最少使用算法&#xff0c;它的核心思想就是会优先淘汰那些近期最少使用的缓存对象。 在我们日常开发中&#xff0c;UI 界面进行网络图片加载是很正常的一件事情&#xff0c;但是当界面上的图片过于多的时候&#xff0c;不可能每次…

LruCache和DiskLruCache

前言 Android中的三级缓存主要就是内存缓存和硬盘缓存。 Lru(least recently used)意为最近最少使用算法&#xff0c;核心思想就是当缓存满时&#xff0c;会优先淘汰最近最少使用的缓存对象。 LruCache的使用 在Android中可以直接使用LruCache&#xff0c;算法原理是&#xff1…

Android LruCache 缓存

使用场景 1、场景一&#xff1a;图片缓存利器。 可以规定缓存大小、有效避免OOM、自动移除队尾不用的图片缓存、避免HashMap各种问题。 2、场景二&#xff1a;通信缓存 从服务端需要获取数据&#xff0c;但是当访问的数据比较大&#xff0c;比较多&#xff0c;并且是重复数…

Java——LRUCache

概念 简单来说&#xff0c;由于我们的空间是有限的&#xff0c;所以发明了这个数据结构&#xff0c;当我们的空间不够添加新的元素时&#xff0c;就会删除最近最少使用的元素。 其底层逻辑通过哈希表和链表共同实现。哈希表中存储链表的每一个元素&#xff0c;方便进行元素的…

LruCache缓存

Lru算法&#xff1a; Lru 指的是“Least Recently Used-近期最少使用算法”。 1、那么LruCache到底是什么呢&#xff1f; LruCache 是对限定数量的缓存对象持有强引用的缓存&#xff0c;每一次缓存对象被访问&#xff0c;都会被移动到队列的头部。当有对象要被添加到已经达到数…

LruCache 源码解析

1. 概述 对于 Android 开发者&#xff0c;LruCache 肯定不陌生&#xff0c;几乎所有的图片缓存框架都会用到它来实现内存缓存等&#xff0c;可见 LruCache 在 Android 开发中的重要性。LRU 是 Least Recently Used 的缩写&#xff0c;近期最少使用的意思。当我们进行缓存的时候…

LruCache

LruCache这个类是通过Glide得知的&#xff0c;不过它是自己又基于LRU算法自己写了个LruCache工具类&#xff0c;不过基本原理类似&#xff0c;都是基于LRU算法实现的 1.来源 一般来说&#xff0c;缓存策略主要包含缓存的添加、获取和删除这三类操作。如何添加和获取缓存这个比…

Android基础-LruCache原理解析

一、Android中的缓存策略 一般来说&#xff0c;缓存策略主要包含缓存的添加、获取和删除这三类操作。如何添加和获取缓存这个比较好理解&#xff0c;那么为什么还要删除缓存呢&#xff1f;这是因为不管是内存缓存还是硬盘缓存&#xff0c;它们的缓存大小都是有限的。当缓存满了…

LRUCache详解

1.概念 LRU是Least Recently Used的缩写&#xff0c;意思是最近最少使用&#xff0c;它是一种Cache替换算法。 Cache的容量有限&#xff0c;因此当Cache的容量用完后&#xff0c;而又有新的内容需要添加进来时&#xff0c; 就需要挑选并舍弃原有的部分内容&#xff0c;从而腾出…

LRUCache 详解

LRU算法详解 一、什么是 LRU 算法 就是一种缓存淘汰策略。 计算机的缓存容量有限&#xff0c;如果缓存满了就要删除一些内容&#xff0c;给新内容腾位置。但问题是&#xff0c;删除哪些内容呢&#xff1f;我们肯定希望删掉哪些没什么用的缓存&#xff0c;而把有用的数据继续…