Python数据结构之二叉排序树的定义、查找、插入、构造、删除
作者:夏小悠 发布时间:2022-03-03 08:19:51
前言
本篇章主要介绍二叉树的应用之一------二叉排序树,包括二叉排序树的定义、查找、插入、构造、删除及查找效率分析。
1. 二叉排序树的定义
二叉排序树 ( B i n a r y (Binary (Binary S o r t Sort Sort T r e e , B S T ) Tree,BST) Tree,BST),也称为二叉查找树,具有以下性质:
(1) 若左子树非空,则左子树上所有结点的值均小于根结点的值;
(2) 若右子树非空,则右子树上所有结点的值均大于根结点的值;
(3) 左、右子树也分别是一棵二叉排序树。
综上可知,在二叉排序树中:左子树结点的值 < 根结点的值 < 右子树结点的值
,所以对二叉排序树进行中序遍历,可以得到一个递增的有序序列。
2. 二叉排序树的查找
二叉排序树的查找是从根结点开始,沿某个分支逐层向下比较的过程。若二叉排序树非空,先将给定的关键字与根结点的关键字进行比较,若相等,则查找成功;若不相等,如果小于根结点的关键字,则在根结点的左子树上查找,如果大于根结点的关键字,则在根结点的右子树上查找。
二叉排序树的查找算法:
def BSTSearch(self, k):
TreeNode = self.RootNode
while TreeNode is not None and k != TreeNode.data:
if k < TreeNode.data:
TreeNode = TreeNode.lchild
else:
TreeNode = TreeNode.rchild
return TreeNode
3. 二叉排序树的插入
二叉排序树作为一种动态树表,它的结构通常不是一次生成的,而是在查找过程中,当树中不存在关键字等于给定值的结点时插入的。
插入过程如下:若二叉排序树为空,则直接插入结点;若非空,先将给定的关键字与根结点的关键字进行比较,若小于根结点的关键字,则插入左子树,若大于根结点的关键字,则插入右子树。插入的结点一定是一个新添加的叶结点,且是查找失败时的查找路径上访问的最后一个结点的左孩子或右孩子。
二叉排序树的插入算法:
def BSTInsert(self, k):
TreeNode = self.RootNode
if TreeNode is None:
self.RootNode = BiTreeLinkNode(k)
return True
while True:
if k < TreeNode.data:
if TreeNode.lchild is None:
TreeNode.lchild = BiTreeLinkNode(k)
return True
TreeNode = TreeNode.lchild
elif k > TreeNode.data:
if TreeNode.rchild is None:
TreeNode.rchild = BiTreeLinkNode(k)
return True
TreeNode = TreeNode.rchild
else:
return False
4. 二叉排序树的构造
二叉排序树的构造过程如下:从一棵空树出发,依次输入元素,将它们插入树中的合适位置。关键字的序列不同,构造出来的二叉排序树也会有所不同,比如下图:
二叉排序树的构造算法:
def CreateBST(self):
for val in self.data_list:
self.BSTInsert(val)
return self.RootNode
5. 二叉排序树的删除
在二叉排序树中删除一个结点时,不能把以该结点为根的子树上的结点都删除,必须先把被删除的结点从存储二叉排序树的链表上摘下,将因删除结点而断开的二叉链表重新连接起来,同时确保二叉排序树的性质不会丢失。具体分三种情况:
(1) 如果被删除的结点是叶结点,可以直接删除;
(2) 如果被删除的结点只有一棵左子树或右子树,需要让该结点的子树成为该结点的父结点的子树,以替代被删除结点的位置;
(3) 被删除的结点有左子树和右子树,需要用该结点的直接后继来代替该结点的位置,然后从二叉排序树中删去这个直接后继。
6. 二叉排序树的查找效率分析
如果二叉排序树的左、右子树的高度之差的绝对值不超过1,则这样的二叉树称为平衡二叉树,它的平均查找长度为 O ( l o g 2 n ) O(log_2n) O(log2n);如果二叉排序树是一个只有左子树或右子树的单支树(类似于有序的单链表),则它的平均查找长度为 O ( n ) 。
在等概率情况下,有序列 { 2 , 1 , 4 , 3 }成的排序二叉树的查找成功的平均查找长度为
有序列 { 1 , 2 , 3 , 4 } 构成的排序二叉树的查找成功的平均查找长度为
二叉排序树的查找效率主要取决于树的高度,如果要提高查找效率,在构造二叉排序时最好不要使用有序的序列,尽量构造平衡二叉树。
有关平均查找长度 A S L ASL ASL的知识会在查找这部分再说。
总结
来源:https://blog.csdn.net/qq_42730750/article/details/108269832


猜你喜欢
- 通常程序会被编写为一个顺序执行并完成一个独立任务的代码。如果没有特别的需求,最好总是这样写代码,因为这种类型的程序通常很容易写,也很容易维护
- 和C语言一样,引号属于特殊功能字符,不能够像普通字符那样直接通过print打印,需要进行一些处理,比如说反斜杠转义等。这里介绍几种打印三引号
- 1、检查本机python 版本:2、安装Qt5 执行如下指令:pip install PyQt5 -i https://pypi.douba
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN&q
- 1、前不久,friendfeed.com把主导航从上面,移到了右侧。现在,又改到了左侧。2、现在,twitter.com把页签(相当于二级导
- python中的列表和元组# 1.列表的格式# [数据1,数据2,数据3,···]# 列表 可变数据类型# 列表可以存储多个数据,数据之间的
- 支持向量机可以用来拟合线性回归。 相同的最大间隔(maximum margin)的概念应用到线性回归拟合。代替最大化分割两类目标是,最大化分
- 之前安装mysql 5.7.12时未做总结,换新电脑,补上安装记录,安装的时候,找了些网友的安装记录,发现好多坑(一)mysql 5.7.1
- 如何提高Request集合的使用效率?以加快程序处理速度: strTitle=Request.Form("Title&q
- pip简介pip 是一个现代的,通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安装、卸载的功能pip是官方推荐的
- Array.prototype._ = function(){var _p = 0;var _v = 0;(function(){ 
- 传说用这个语句管用:select top 5 * from tablename order by newid() 我放到sql的查询分析器里
- 马氏距离区别于欧式距离,如百度知道中所言:马氏距离(Mahalanobis distance)是由印度统计学家马哈拉诺比斯(P. C. Ma
- 版本号:Python2.7.5,Python3改动较大,各位另寻教程。所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存
- 本文实例讲述了Python基于多线程实现抓取数据存入数据库的方法。分享给大家供大家参考,具体如下:1. 数据库类""&q
- 一、背景(正)地理编码指的是:将地理位置名称转换成经纬度;逆地理编码指的是:将经纬度转换成地理位置信息,如地名、所在的省份或城市等百度地图提
- 本文介绍了使用python wasmtime来访问rust库的便捷方法,步骤极其简练,可以在生产环境中使用。安装rust target wa
- fixtures调用其他fixtures及fixture复用性 pytest最大的优点之一就是它非常灵活。它可以将复杂的测试需求简
- 最近公司在研发app,选择了基于Vue框架的vux组件库,现总结在实现上拉刷新功能遇到的坑:1.问题:只刷新一次,解决方法:需要自己手动重置
- 本文使用css结合js技术给网页背景background 插入flash播放器播放音乐,想法很大胆,呵呵!刚刚乱试一翻搞出这个,有意思吗?请