位置: 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发送文件)

  • 增值税欠缴
  • 消费税的三种计税方法及各自的计算公式
  • 生产成本明细科目是材料还是产品
  • 红字信息表可以开一半吗
  • 发出商品是用进货吗
  • 技术转让所得免征企业所得税
  • 生产企业出售空调设备
  • 库存现金限额的概念
  • 固定资产什么时候入账
  • 用于在建工程的贷款利息
  • 金融企业发放贷款时发生的交易费用
  • 个人抬头发票能开专票吗
  • 境外公司付款给国内公司人民币
  • 个人去税务局开票流程
  • 代收代付给个人
  • 一般纳税人贸易公司每个月最低费用多少
  • 支付董事会成员津贴计入什么科目
  • 流转税与所得税的区别
  • 社会团体的费用包括哪些
  • 冲红发票开错了怎么办
  • 工地买东西怎么记账
  • 收到转账支票又背书转让怎么写会计科目
  • VM虚拟机怎么安装网心容器
  • 常见转移支付事项有哪些情况
  • 错账按产生原因来看有两种
  • 长期贷款利息怎样计算
  • 转包工程款怎么结算
  • windows缺失
  • 企业所得税汇算清缴扣除标准2023
  • VMware虚拟机中怎么复制粘贴
  • 0x0000000a蓝屏代码怎么解决
  • PHP:base64_decode()的用法_url函数
  • 工程施工与工程结算会计科目
  • 代扣代缴个人所得税手续费返还 增值税
  • 带着崽崽宠老公免费阅读
  • php上传文件到指定目录
  • thinkphp框架作用
  • 微信小程序开发公司
  • thinkphp消息通知
  • 代开的普通发票如何盖章
  • 电缆租赁发票开具属于什么项目
  • 新法典离职
  • 营业收入小于利息收入
  • 织梦官方网站
  • 员工福利费的账务处理
  • 专利费用计入什么会计科目
  • 长期待摊费用的摊销方法
  • mysql数据表分区
  • 金税三期业务操作手册
  • 以前年度费用退回
  • 成本类科目会结转到损益类科目吗?
  • 财务报表的勾稽关系结构图
  • 采购的样品没有发票怎么入账
  • 代扣代缴城建税为什么没有计入利润
  • 事业单位利息收入
  • 销售费用的会计分录摘要
  • 收购分公司有什么要求
  • 变更公司股东要收费吗
  • 房地产公司员工购房
  • 展览展示服务费计入什么科目
  • 借款归还时的收据填写
  • 增值税发票折扣发票
  • 金税盘显示已到锁死期
  • 盘亏应该怎么处理
  • 工商银行代收是什么意思
  • 应付账款暂估可以法人付款吗
  • 发票系统升级后怎样开票
  • u盘安装win7系统鼠标键盘没反应
  • linux find命令查找文件名
  • xpcpu占用100
  • windows10运用
  • 客齐是什么意思
  • jquery 选择
  • cmd网络管理命令的功能和用法
  • c# for unity
  • 深入理解中国式现代化
  • js做时钟让钟表转起来
  • 自来水征税
  • 河北税务登录密码是多少
  • 建筑工程招标代理服务费
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设