位置: IT常识 - 正文

Python中的二叉排序树和平衡二叉树是什么(python二叉树遍历算法)

编辑:rootadmin

推荐整理分享Python中的二叉排序树和平衡二叉树是什么(python二叉树遍历算法),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python二叉树遍历算法,python数据结构二叉树的查找算法,python中的二叉树,python数据结构二叉树的查找算法,python数据结构二叉树的查找算法,python二叉树遍历算法,python中的二叉树,python中的二叉树,内容如对您有帮助,希望把文章链接给更多的朋友!

二叉排序树

二叉排序树又称为二叉查找树。它或者是一颗空树,或者是具有下列性质的二叉树:

若它的左子树不为空,则左子树上所有节点的值均小于它的根结构的值;若它的右子树不为空,则右子树上所有节点的值均大于它的根结构的值;它的左、右子树也分别为二叉排序树。

构造一颗二叉排序树的目的,往往不是为了排序,而是为了提高查找和插入删除关键字的速度。

二叉排序树的操作:

查找:对比节点的值和关键字,相等则表明找到了;小了则往节点的左子树去找,大了则往右子树去找,这么递归下去,最后返回布尔值或找到的节点。插入:从根节点开始逐个与关键字进行对比,小了去左边,大了去右边,碰到子树为空的情况就将新的节点链接。删除:如果要删除的节点是叶子,直接删;如果只有左子树或只有右子树,则删除节点后,将子树链接到父节点即可;如果同时有左右子树,则可以将二叉排序树进行中序遍历,取将要被删除的节点的前驱或者后继节点替代这个被删除的节点的位置。

"""定义一个二叉树节点类。以讨论算法为主,忽略了一些诸如对数据类型进行判断的问题。"""def__init__(self,data,left=None,right=None):"""初始化:paramdata:节点储存的数据:paramleft:节点左子树:paramright:节点右子树"""self.data=dataself.left=leftself.right=rightclassBinarySortTree:"""基于BSTNode类的二叉排序树。维护一个根节点的指针。"""def__init__(self):self._root=Nonedefis_empty(self):returnself._rootisNonedefsearch(self,key):"""关键码检索:paramkey:关键码:return:查询节点或None"""bt=self._rootwhilebt:entry=bt.dataifkey<entry:bt=bt.leftelifkey>entry:bt=bt.rightelse:returnentryreturnNonedefinsert(self,key):"""插入操作:paramkey:关键码:return:布尔值"""bt=self._rootifnotbt:self._root=BSTNode(key)returnwhileTrue:entry=bt.dataifkey<entry:ifbt.leftisNone:bt.left=BSTNode(key)returnbt=bt.leftelifkey>entry:ifbt.rightisNone:bt.right=BSTNode(key)returnbt=bt.rightelse:bt.data=keyreturndefdelete(self,key):"""二叉排序树最复杂的方法:paramkey:关键码:return:布尔值"""p,q=None,self._root#维持p为q的父节点,用于后面的链接操作ifnotq:print("空树!")returnwhileqandq.data!=key:p=qifkey<q.data:q=q.leftelse:q=q.rightifnotq:#当树中没有关键码key时,结束退出。return#上面已将找到了要删除的节点,用q引用。而p则是q的父节点或者None(q为根节点时)。ifnotq.left:ifpisNone:self._root=q.rightelifqisp.left:p.left=q.rightelse:p.right=q.rightreturn#查找节点q的左子树的最右节点,将q的右子树链接为该节点的右子树#该方法可能会增大树的深度,效率并不算高。可以设计其它的方法。r=q.leftwhiler.right:r=r.rightr.right=q.rightifpisNone:self._root=q.leftelifp.leftisq:p.left=q.leftelse:p.right=q.leftdef__iter__(self):"""实现二叉树的中序遍历算法,展示我们创建的二叉排序树.直接使用python内置的列表作为一个栈。:return:data"""stack=[]node=self._rootwhilenodeorstack:whilenode:stack.append(node)node=node.leftnode=stack.pop()yieldnode.datanode=node.rightif__name__=='__main__':lis=[62,58,88,48,73,99,35,51,93,29,37,49,56,36,50]bs_tree=BinarySortTree()foriinrange(len(lis)):bs_tree.insert(lis[i])#bs_tree.insert(100)bs_tree.delete(58)foriinbs_tree:print(i,end="")#print("\n",bs_tree.search(4))

相关推荐:《Python视频教程》

二叉排序树总结:

二叉排序树以链式进行存储,保持了链接结构在插入和删除操作上的优点。在极端情况下,查询次数为1,但操作次数不会超过树的深度。也就是说,二叉排序树的查找性能取决于二叉排序树的形状,也就引申出了后面的平衡二叉树。给定一个元素集合,可以构造不同的二叉排序树,当它同时是一个完全二叉树的时候,查找的时间复杂度为O(log(n)),近似于二分查找。当出现最极端的斜树时,其时间复杂度为O(n),等同于顺序查找,效果最差。

Python中的二叉排序树和平衡二叉树是什么(python二叉树遍历算法)

平衡二叉树

平衡二叉树(AVL树,发明者的姓名缩写):一种高度平衡的排序二叉树,其每一个节点的左子树和右子树的高度差最多等于1。

平衡二叉树首先必须是一棵二叉排序树!

平衡因子(Balance Factor):将二叉树上节点的左子树深度减去右子树深度的值。

对于平衡二叉树所有包括分支节点和叶节点的平衡因子只可能是-1,0和1,只要有一个节点的因子不在这三个值之内,该二叉树就是不平衡的。

最小不平衡子树:距离插入结点最近的,且平衡因子的绝对值大于1的节点为根的子树。

平衡二叉树的构建思想:每当插入一个新结点时,先检查是否破坏了树的平衡性,若有,找出最小不平衡子树。在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的连接关系,进行相应的旋转,成为新的平衡子树。

下面是由[1,2,3,4,5,6,7,10,9]构建平衡二叉树

本文链接地址:https://www.jiuchutong.com/zhishi/304733.html 转载请保留说明!

上一篇:Python如何实现打字训练的程序(python dayup)

下一篇:python socket发送消息的方法(python socket发送文件)

  • 印花税计算是含增值税吗
  • 去年企业所得税税率是多少
  • 租赁办公场所的请示
  • 其他权益工具影响哪些报表
  • 固定资产分期付款会计处理
  • 总公司签合同发票由分公司开可以吗
  • 资产负债表所有者权益和利润表关系
  • 深圳重工业企业有哪些
  • 贷款利息收入要减去支付利息支出吗
  • 预提费用 会计准则
  • 代扣代缴附加税怎么做账
  • 客户退货不退款会计怎么处理
  • 海关进口增值税计算公式
  • 不征税的政府补助如何开票
  • 因公出差的人身故怎么办
  • 如何在国税网站下载财务报表
  • 收到未知款项如何做账
  • 河道管理费入什么科目
  • 两个帐套合并为一个
  • 企业所得税中的资产总额怎么填
  • 员工垫付公司钱怎么入账
  • 电子税务局发送短信异常是怎么回事
  • Linux系统中Squid代理服务器配置全过程解析
  • PHP:oci_pconnect()的用法_Oracle函数
  • win7上网提速
  • 企业从政府取得的经济资源均应当
  • php单双引号的区别
  • linux系统如何更改主机名
  • 在网上怎
  • php 随机数
  • 会计准则对企业行为的影响分析论文
  • 冲账怎么写?
  • php中foreach循环遍历数组
  • 售后租回交易的第二年利息怎么算
  • 企业会计准则规定了
  • 一般人财务报表季报还是月报
  • 免缴纳的增值税怎么做账
  • python卡方分布随机数
  • 取得发票没有加税怎么办
  • 固定资产盘亏是管理费用吗
  • 个人注册公司是否可以免税
  • 对公账户一直没有对账,会有什么后果吗?
  • 税号指的是什么
  • 减免税做营业外收入的会计分录
  • 员工借款可以直接转账吗
  • 试算平衡表的编制方法
  • 进项税额抵扣不完要做分录吗
  • 行程单如何验真伪
  • 发票入账但是没付款有什么税务风险
  • 供应商销售折让怎么入账
  • 资产负债表中的货币资金怎么算
  • 装订好的凭证可以拿掉一页吗
  • 资产负债表怎么看财务状况
  • 微软在印度的投资
  • 虚拟机ubuntu20.04
  • linux lftp命令
  • 怎么找回手机删除的照片和视频
  • ubuntu下安装deb文件
  • ubuntu 10.04安装
  • linux ./执行
  • realshed.exe - realshed是什么进程 有什么用
  • win10累积更新是什么意思
  • win7自带防火墙关闭后自己打开啥原因
  • window10的微软商店在哪
  • myfastupdate.exe - myfastupdate是什么进程文件 有什么用
  • win7如何禁用网卡
  • jquery layout 布局
  • python加密模块
  • bat文件加密bat解密脚本
  • linux的ftp命令
  • iphone触控手势
  • 对应用进行单元测试的是
  • shell脚本视频教程
  • unity androidx
  • jquery详解
  • ca证书密码是什么
  • 公司加油卡充值需要带什么
  • 公司给个人买房,怎么做账
  • 金税三期可以申报个税吗
  • 大兴区地方税务局
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设