参考:

https://www.cnblogs.com/linxiyue/p/3659448.html?utm_source=tuicool&utm_medium=referral

class Node:
def __init__(self,key):
self.key=key
self.left=None
self.right=None
self.height=0
class AVLTree:
def __init__(self):
self.root=None def find(self,key):
if self.root is None:
return None
else:
return self._find(key,self.root)
def _find(self,key,node):
if node is None:
return None
elif key<node.key:
return self._find(key,self.left)
elif key>node.key:
return self._find(key,self.right)
else:
return node def findMin(self):
if self.root is None:
return None
else:
return self._findMin(self.root) def _findMin(self,node):
if node.left:
return self._findMin(node.left)
else:
return node def findMax(self):
if self.root is None:
return None
else:
return self._findMax(self.root) def _findMax(self,node):
if node.right:
return self._findMax(node.right)
else:
return node def height(self,node):
if node is None:
return -1
else:
return node.height #前序遍历
def Preorder(self):
if self.root:
self.preorder(self.root)
print() def preorder(self,node):
if node:
print(node.key,end="")
self.preorder(node.left)
self.preorder(node.right) #右旋
def rotate_right(self,node):
k=node.left
node.left=k.right
k.right=node
node.height=max(self.height(node.left),self.height(node.right))+1
k.height=max(self.height(k.left),node.height)+1
return k #左旋
def rotate_left(self,node):
k=node.right
node.right=k.left
k.left=node
node.height=max(self.height(node.left),self.height(node.right))+1
k.height=max(self.height(k.right),node.height)+1
return k #左右双旋
def rotate_le_ri(self,node):
node.left=self.rotate_left(node.left)
return self.rotate_right(node) #右左双旋
def rotate_ri_le(self,node):
node.right=self.rotate_right(node.right)
return self.rotate_left(node) def Insert(self,key):
if self.root is None:
self.root=Node(key)
else:
self.root=self.insert(key,self.root) def insert(self,key,node):
if not node:
node=Node(key)
elif key<node.key:
node.left=self.insert(key,node.left)
if self.height(node.left)-self.height(node.right)==2:
if key<node.left.key:
#左左
node=self.rotate_right(node)
else:
#左右
node=self.rotate_le_ri(node)
elif key>node.key:
node.right=self.insert(key,node.right)
if self.height(node.right)-self.height(node.left)==2:
if key>node.right.key:
node=self.rotate_left(node)
else:
node=self.rotate_ri_le(node)
node.height=max(self.height(node.left),self.height(node.right))+1
return node def Remove(self,key):
if self.root is None:
raise KeyError("No such key found!")
else:
self.root=self.remove(key,self.root) def remove(self,key,node):
if node is None:
print("No such key found!")
elif key<node.key:
node.left=self.remove(key,node.left)
if self.height(node.right)-self.height(node.left)==2:
if self.height(node.right.right)>=self.height(node.right.left):
node=self.rotate_left(node)
else:
node=self.rotate_ri_le(node)
node.height=max(self.height(node.left),self.height(node.right))+1
elif key>node.key:
node.right=self.remove(key,node.right)
if self.height(node.left)-self.height(node.right)==2:
if self.height(node.left.right)>self.height(node.left.left):
node=self.rotate_le_ri(node)
else:
node=self.rotate_right(node)
node.height=max(self.height(node.left),self.height(node.right))+1
elif node.left and node.right:
#左右孩子都有
if self.height(node.left)>=self.height(node.right):
#左比右高,那么右子树找最小的放上来做根
k=self._findMin(node.right)
node.key=k.key
node.right=self.remove(k.key,node.right)
else:
#左比右低,那么左子树找最大的放上来做根
k=self._findMax(node.left)
node.key=k.key
node.left=self.remove(k.key,node.left)
node.height=max(self.height(node.left),self.height(node.right))+1
else:
#只有左孩子或右孩子或都没有
if node.left:
node=node.left
else:
#叶子节点也算在此情况
node=node.right
return node

说实话用python写类写的头疼,self真的多,不如写C+省事点

下面测试语句

p=AVLTree()
p.Insert(5)
p.Preorder()
p.Insert(4)
p.Preorder()
p.Insert(6)
p.Preorder()
p.Insert(1)
p.Preorder()
p.Insert(3)
p.Preorder()
p.Remove(6)
p.Preorder()

效果:

Python实现AVL树的更多相关文章

  1. AVL树Python实现(使用递推实现添加与删除)

    # coding=utf-8 # AVL树的Python实现(树的节点中包含了指向父节点的指针) def get_height(node): return node.height if node el ...

  2. AVL树Python实现

    # coding=utf-8 # AVL树Python实现 def get_height(node): return node.height if node else -1 def tree_mini ...

  3. AVL树的python实现

    AVL树是带有平衡条件的二叉查找树,一般要求每个节点的左子树和右子树的高度最多差1(空树的高度定义为-1). 在高度为h的AVL树中,最少的节点数S(h)由S(h)=S(h-1)+S(h-2)+1得出 ...

  4. AVL树插入(Python实现)

    建立AVL树 class AVLNode(object): def __init__(self,data): self.data = data self.lchild = None self.rchi ...

  5. python常用算法(5)——树,二叉树与AVL树

    1,树 树是一种非常重要的非线性数据结构,直观的看,它是数据元素(在树中称为节点)按分支关系组织起来的结构,很像自然界中树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形 ...

  6. 【数据结构与算法Python版学习笔记】树——平衡二叉搜索树(AVL树)

    定义 能够在key插入时一直保持平衡的二叉查找树: AVL树 利用AVL树实现ADT Map, 基本上与BST的实现相同,不同之处仅在于二叉树的生成与维护过程 平衡因子 AVL树的实现中, 需要对每个 ...

  7. AVL树探秘

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev) ,专注于干货分享,号内有 10T 书籍和视频资源,后台回复 「1024」 即可领取,欢迎大家关注,二维码文末可以扫. 一.AV ...

  8. 数据结构中的树(二叉树、二叉搜索树、AVL树)

    数据结构动图展示网站 树的概念 树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>=1)个有限节点组成一个具有 ...

  9. 算法与数据结构(十一) 平衡二叉树(AVL树)

    今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...

随机推荐

  1. 自己的系统重装之后,怎么去重新的装官方的office办公软件,详细教程

    1  访问官网地址--微软,并通过自己的微软账号进行登录,转到下面的界面 2   点击上图的菜单栏的offce菜单项,跳转到下图 3  点击  菜单栏的产品  之后选择  查看office的全部的历史 ...

  2. selenimu--find_element_by_css_selector()方法汇总

    一.单一属性定位 type selector driver.find_element_by_css_selector('input') id 定位 driver.find_element_by_css ...

  3. kanbanflow的使用

    也许在工作中大家都听说过番茄工作法,就是每次在一个番茄钟25分钟内保持高度专注,并且在时间结束的时候会提醒你,然后稍作休息5分钟:此外,在产品迭代开发过程中常常会接受到不同的task:那么,我们是否可 ...

  4. tcolorbox 宏包简明教程

    嗯,我消失好几天了.那么,我都在做什么呢?没错,就是写这篇文章了.这篇文章写起来着实有些费神了.于是,如果你觉得这篇文章对你有帮助,不妨扫描文末的二维码,适量赞助一下哦~! tcolorbox 宏包是 ...

  5. 安卓开发中遇到java.net.SocketException: Permission denied

    仅需在AndroidManifest.xml添加 <uses-permission android:name="android.permission.INTERNET" /& ...

  6. MarkDown图文编辑系列教程(一)

    MarkDown图文编辑系列教程(一) 一.写在前面 引言 如果你想作为博主发帖,markdown语法是你的基础操作.本教程分为三个部分,大体为基础操作与进阶操作(公式编辑).本篇为第一部分,对基础操 ...

  7. 白面系列 mongoDB

    mongoDB和redis一样,都是noSQL技术之一. redis是Key-Value存储,mongoDB是文档存储. 文档存储一般用类似json的格式存储,存储的内容是文档型的.文档是一组键值(k ...

  8. mybatis-plus - TableInfo

    在前面 的 inject() 方法中, 调用了一个 TableInfoHelper.initTableInfo(builderAssistant, modelClass) 方法, 来获取 表信息: T ...

  9. WebViewJavascriptBridge(H5与原生交互)

    https://github.com/wangjiaojiao77/WebViewJavascriptBridge(IOS)和 https://github.com/wangjiaojiao77/Js ...

  10. vscode+vue 一些基本操作

    1.安装好 vscode 和 node.js 安装node.js是为了用npm(管理项目依赖) 2.调出终端 crtl +~ , 3.终端全局安装 vue-cli  安装整个脚手架,能快速给我们构建v ...