话不多说,兄弟萌,show me the code!

from chapter8.btSearch import DictBinTree
from chapter8.Assoc import Assocclass BinTNode:"""树节点类"""def __init__(self,dat,left=None,right=None):self.data = datself.left = leftself.right = rightclass AVLNode(BinTNode):def __init__(self,data):BinTNode.__init__(self,data)self.bf = 0class DictAVL(DictBinTree):def __init__(self):DictBinTree.__init__(self)@staticmethoddef LL(a,b):a.left = b.rightb.right = aa.bf = b.bf = 0return b@staticmethoddef RR(a,b):a.right = b.leftb.left = aa.bf = b.bf = 0return b@staticmethoddef LR(a,b):c = b.righta.left, b.right = c.right, c.leftc.left, c.right = b, aif c.bf == 0:"""c本身就是插入节点"""a.bf = b.bf = 0elif c.bf == 1:"""新节点在c的左子树"""a.bf = -1b.bf = 0else:"""新节点在c的右子树"""a.bf = 0b.bf = 1c.bf = 0return c@staticmethoddef RL(a,b):c = b.lefta.right, b.left = c.left, c.rightc.left, c.right = a, bif c.bf == 0:"""c本身就是插入节点"""a.bf = 0b.bf = 0elif c.bf == 1:"""新节点在c的左子树"""a.bf = 0b.bf = -1else:"""新节点在c的右子树"""a.bf = 1b.bf = 0c.bf = 0return cdef insert(self,key,value):a = p = self._rootif a == None:self._root = AVLNode(Assoc(key,value))returnpa = q = None # 维持pa,q为a,p的父节点while p is not None:"""确定插入位置及最小非平衡子树"""if key == p.data.key:"""key存在,修改关联值并结束"""p.data.value = valuereturnif p.bf != 0:pa, a = q, p # 已知最小非平衡子树q = pif key < p.data.key:p = p.leftelse:p = p.right# q是插入点的父节点, pa, a 记录最小非平衡子树node = AVLNode(Assoc(key,value))if key < q.data.key:q.left = node # 作为左子节点else:q.right = node # 或右子节点# 新节点已插入,a 是最小不平衡子树if key < a.data.key:"""新节点在a的左子树"""p = b = a.leftd = 1else:"""新节点在a的右子树"""p = b = a.rightd = -1 # d记录新节点在a的哪棵子树# 修改b到新节点路径上各节点的BF值,b为a的子节点while p != node:"""node一定存在,不用判断p空"""if key < p.data.key:"""p的左子树增高"""p.bf = 1p = p.leftelse:"""p的右子树增高"""p.bf = -1p = p.rightif a.bf == 0:"""a的原bf为0,不会失衡"""a.bf = 0returnif a.bf == -d:"""新节点在较低子树里"""a.bf = 0return# 新节点在较高子树,失衡,必须调整if d == 1:if b.bf == 1:b = DictAVL.LL(a,b) # LL调整else:b = DictAVL.LR(a,b) # LR调整else:if b.bf == -1:b = DictAVL.RR(a,b) # RR调整else:b = DictAVL.RL(a,b) # RL调整if pa == None:"""原a为树根,修改root"""self._root = belse:"""a非树根,新树接在正确位置"""if pa.left == a:pa.left = belse:pa.right = b
DictBinTree类:
from chapter8.Assoc import Assoc
from stack_queue.code import SStackdef btSearch(btree,key):"""二叉排序树的检索算法"""bt = btreewhile bt != None:entry = bt.dataif key < entry.key:bt = bt.leftelif key > entry.key:bt = bt.rightelse: # key == entry.keyreturn entry.value # 返回关键码的关联值# 走完整棵树仍没有找到return Noneclass BinTNode:"""树节点类"""def __init__(self,dat,left=None,right=None):self.data = datself.left = leftself.right = rightclass DictBinTree:"""字典二叉排序树类"""def __init__(self):self._root = Nonedef isEmpty(self):"""判断是否为空"""return self._root is Nonedef search(self,key):"""检索"""bt = self._rootwhile bt != None:entry = bt.dataif key < entry.key:bt = bt.leftelif key > entry.key:bt = bt.rightelse:  # key == entry.keyreturn entry.value  # 返回关键码的关联值# 走完整棵树仍没有找到return Nonedef insert(self,key,value):bt = self._rootif bt == None:"""如果树为空,直接建立一个新关键码和关联值的树根节点"""self._root = BinTNode(Assoc(key,value))return"""否则搜索新节点的插入位置,沿子节点关系向下"""while True:entry = bt.dataif key < entry.key:"""遇到应该走左子树"""if bt.left == None:"""而左子树为空"""bt.left = BinTNode(Assoc(key,value))returnbt = bt.leftelif key > entry.key:"""遇到应该走右子树"""if bt.right == None:"""而右子树为空"""bt.right = BinTNode(Assoc(key,value))returnreturn bt.rightelse:"""碰到值相等"""bt.data.value = valuereturndef values(self):"""中序遍历,值生成迭代器"""t,s = self._root,SStack()while t != None or not s.is_empty():while t != None:s.push(t)t = t.leftt = s.pop()yield t.data.key, t.data.valuet = t.rightdef delete(self,key):"""删除节点,保证树的结构不变"""p,q = None, self._root # 维持p为q的父节点 ,从树根开始找qwhile q != None and q.data.key != key:p = q # 维持p为q的父节点if key < q.data.key:q = q.leftelse:q = q.rightif q is None:return # 树中没有关键码key"""到这里q引用要删除节点,p是其父节点或None(这时q是根节点)"""if q.left == None:"""q没有左子节点"""if p == None:"""q是根节点,直接修改root"""self._root = q.rightelif q == p.left:p.left = q.rightelse:p.right = q.rightreturnr = q.leftwhile r.right != None:r = r.rightr.right = q.rightif p == None:"""q是根节点,修改_root"""self._root = q.leftelif p.left == q:p.left = q.leftelse:p.right =q.leftdef print(self):for k,v in self.entries():print(k,v)def buildDictBinTree(entries):dic = DictBinTree()for k,v in entries:dic.insert(k,v)return dicclass DictOptBinTree(DictBinTree):def __init__(self,seq):DictBinTree.__init__(self)data = sorted(seq)self._root = DictOptBinTree.buildOBT(data,0,len(data)-1)@staticmethoddef buildOBT(data,start,end):if start > end:return Nonemid = (end+start)//2left = DictOptBinTree.buildOBT(data,start,mid-1)right = DictOptBinTree.buildOBT(data,mid+1,end)return BinTNode(Assoc(*data[mid],left,right))
Assoc类:
class Assoc:def __init__(self,key,value):self.key = keyself.value = valuedef __lt__(self, other):"""有时有些操作需要考虑排序"""return self.key < other.keydef __le__(self, other):return self.key < other.key or self.key == other.keydef __str__(self):"""定义字符串表示形式便于输出和交互"""return f"Assoc({self.key},{self.value})"
SStack类:
"""栈的顺序表实现"""class StackUnderflow(ValueError): # 栈下溢(空栈访问)passclass SStack(): # 基于顺序表技术实现的栈类def __init__(self): # 用list对象 _elems存储栈中元素self._elems = [] # 所有栈操作都映射到list操作def is_empty(self):return self._elems == []def top(self): # 查看栈顶元素if self._elems == []:raise StackUnderflow("in SStack.top()")return self._elems[-1]def push(self,elem):self._elems.append(elem)def pop(self): # 弹出栈顶元素if self._elems == []:raise StackUnderflow("in SStack.pop()")return self._elems.pop()

python平衡二叉排序树相关推荐

  1. 【swjtu】数据结构实验8_平衡二叉排序树

    实验内容及要求: 从键盘输入若干两两互不相同的非0整数,直到输入0时停止.将输入的所有非0整数按输入次序插入二叉排序树来构造平衡的二叉排序树.输出平衡的二叉排序树的先序和中序递归遍历次序:按中序递归遍 ...

  2. 大话数据结构:平衡二叉排序树

    基础介绍 平衡二叉排序树为了让二叉树的查找 删除 效率能够达到理论上的最好性能.主要手段就是旋转子树,有左旋和右旋,通过计算节点的平衡值确定如何旋转. 代码 #include "stdio. ...

  3. 二叉排序树和平衡二叉排序树

    二叉排序树又称为二叉查找树,它是一颗特殊的二叉树.(空树) 性质:1.若它的左子树非空,则左子树上的所有结点的值均小于根结点的值. 2.若它的右子树非空,则右子树上的所有结点的值均大于根结点的值. 3 ...

  4. 平衡二叉排序树--调整方法快速记忆方法(渣男丢妻弃子法)

    平衡二叉排序树–调整方法快速记忆方法 首先我们先了解下什么是平衡二叉排序树. 平衡二叉排序树又称AVL树.一棵平衡二叉排序树或者是空树,或者是具有下列性质的二叉排序树: ①左子树与右子树的高度之差的绝 ...

  5. 平衡二叉排序树的创建和实现调整过程

    1.已知一棵二叉树的先序序列为:abcedfgh,中序序列为:bcedaghf,画出该二叉树,并给出其后序序列. 2.已知一组关键字为(15,11,22,5,66,58,36,10,38),按照该元素 ...

  6. 平衡二叉排序树(完整案例详解及完整C代码实现)

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  7. 数据结构课设——ASL平衡二叉排序树

    题目 编程实现二叉平衡树的创建.插入.删除和查询 对于给定的这组数二叉平衡树上进行查找,给出两种情况下的查找成功和不成功时的ASL 代码 #include <bits/stdc++.h> ...

  8. 设平衡二叉排序树(AVL树) 的节点个数为n,则其平均检索长度为log2n

    平衡二叉树又称AVL树,它或者是一棵空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树, 且左子树和右子树的深度之差的绝对值不超过1,若将二叉树上节点的平衡因子BF定义为该节点的左子树 ...

  9. 【Python全栈100天学习笔记】Day37MySQL详解(sql语句基本操作含索引、视图、存储过程)

    SQL详解 基本操作 我们通常可以将SQL分为三类:DDL(数据定义语言).DML(数据操作语言)和DCL(数据控制语言).DDL主要用于创建(create).删除(drop).修改(alter)数据 ...

最新文章

  1. 爆破专业学生任母校爆破工作总指挥走红
  2. Flink 双流 Join 的3种操作示例
  3. 第55课 分解质因数 《小学生C++编程入门》
  4. python分类器鸢尾花怎么写_python机器学习基础教程:鸢尾花分类
  5. py导入包异常跳出_python~异常处理及包
  6. 用Windows Live Writer在博客园发布Post
  7. oracle Dataguard数据库不同步处理备忘
  8. 【POJ 2342】Anniversary party(入门树形dp)
  9. mysql 8.0安装_MySQL5.7升级到8.0过程详解
  10. linux如何清理文件系统,最佳Linux文件系统清理工具
  11. uni-app 使用高德地图
  12. Java 谷歌翻译 api 调用
  13. 5G+4G聚合路由器
  14. HiJson——Json解析工具
  15. VMware虚拟机安装Ubuntu 2022最新版详细图文安装教程(VMware虚拟机安装+Ubuntu下载+VMware虚拟机配置运行)
  16. MySQL - Emoji 表情包编码
  17. android oreo 老机型,三年的老机型,一加手机1也有安卓8.0了!
  18. 《HelloGitHub》第 53 期
  19. 计算机辅助技术衡量国家,机械计算机辅助技术(CAD)及其发展趋势
  20. python时间戳是什么意思_python时间戳是什么

热门文章

  1. P56-前端基础CSS-背景图片线性渐变
  2. 矩阵计算器的c语言代码大全,一个有关向量与矩阵的实用计算器程序
  3. blender建模基础操作
  4. sqlserver 求平均数,中位数,众数
  5. QUIC协议设计(二)-握手
  6. 结构体-struct
  7. 查询python答案的app_智慧职教APPPython程序设计期末考试查题公众号答案
  8. 0013 求圆柱体体积
  9. 高仿Android QQ2012登陆界面和注册界面
  10. 【云原生】K8s PSP 和 securityContext 介绍与使用