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

  • 陈列费可以开专票吗
  • 咨询服务业涉及税费
  • 文化建设税怎么填
  • 企业给员工租的公寓楼都是什么样的
  • 进项税额结转不结转
  • 人力资源服务费发票可以抵扣吗
  • 出口专用发票应在哪里开
  • 已经确认收入的售出商品发生销售退回时
  • 预付租金就要交增值税吗
  • 交车辆购置税可以刷信用卡吗
  • 一般纳税人抵扣小规模期间的专票怎么解决
  • 检测费属于什么税目
  • 公司账户转个人账户用途怎么写
  • 租赁房屋的装修
  • 即用于一般计税又用于简易计税的固定资产抵扣
  • 重点创业人群
  • 电子发票增加开票项目
  • 少计收入被处罚账务处理怎么做?
  • 利润表里的其他业务利润怎么形成的
  • 发出商品发生损失
  • 诉讼费计入哪里
  • 建筑企业分包工程的纳税人
  • 公司个人股份转让需要缴税吗
  • 本年利润有余额可以结账吗
  • 注册表被恶意锁定怎么恢复正常
  • 宽带连接错误代码691
  • w11系统安卓
  • PHP:php_check_syntax()的用法_misc函数
  • dcom进程
  • php image
  • 多提附加税跨年怎么计算
  • php编程获取音频信息
  • thinkphpcount查询
  • axios请求设置超时时间
  • php 中奖概率算法
  • js中的截取字符串
  • php二维数组foreach
  • 小规模纳税人减按1%账务处理
  • python中numpy数组和列表的区别
  • 如何确定可以结婚生子
  • 应交税费的分析应重点关注企业
  • 汇票没到期如何兑现
  • 销售包括是销项税金吗
  • spark sql add jar
  • 什么是一般公共预算财政拨款
  • 企业所得税年报更正申报怎么操作
  • 库存商品暂估入库是什么意思
  • 直接计入当期利润吗
  • 房地产企业帐套设置
  • 材料抵扣进项税额
  • 未交增值税的核算方法
  • 土地出让合同的签订主体
  • 专用发票给客户的都要盖章吗
  • 会计凭证后面需要打勾的是
  • 去年的物业费今年收到了可以确认收入吗
  • 新手会计建账的资料在哪里弄
  • 总账建账要建全部科目吗
  • sqlserver批量备份数据库
  • mysql必知必会和sql基础教程
  • sqlserver附加数据库时出错,请单击消息中的超链接
  • win8系统怎么远程电脑
  • mac 特殊符号
  • win 8系统怎么样
  • awtk linux
  • windows7打不了字怎么办
  • css 3
  • unity3d初学者教程视频
  • 模板创造
  • python日历查询系统
  • 怎么用批处理显示文字
  • java颜色代码对照表图片
  • javascript什么用
  • python在windows
  • 客货两用车应如何运输
  • 青椒课堂怎么激活登录
  • 先进材料包括哪些行业
  • 省级税务机关是什么
  • 印花税零申报表怎么填步骤
  • 环保标识码
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设