参考:

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. C#的结构和数组

    下面我们继续学习C#的语法.结构struct,C#中的结构和我们PLC中建立的UDT(结构体)是一样的.里面存储了相关的不同类型的数据. 有一句话我觉得十分重要:方法是依存于结构和对象存在的.这以后我 ...

  2. Python之五:函数

    函数会给一段语句块命名,我们可以在任何时候调用它,运行其中的代码 它的一班语法: def fun_name(x): 函数语句体 return a def :说明这是一个函数,我们定义了一个函数: fu ...

  3. vue的$nextTick

    https://segmentfault.com/a/1190000012861862 简单来说:如果你修改了某个dom中的数据,视图并不会立即更新.Vue 实现响应式并不是数据发生变化之后 DOM ...

  4. Structure preserving unsupervised feature selection

    Abstract • 使用自表示模型提取特征间的关系,结构保留约束来保持数据的局部流形结构: 1  Introduction • Contributions: (1)提出基于自表示模型的特征选择: ( ...

  5. H5 使用input标签上传图片给后台

    html代码: <div class="hpk-showimg"> <!-- 营业执照 --> <div class="idcardup&q ...

  6. wget安装nginx

    #下载: wget http://nginx.org/download/nginx-1.8.0.tar.gz #解压: tar -zxvf nginx-1.8.0.tar.gz #安装依赖插件 yum ...

  7. redis 列表类型list

    列表类型(list)1.插入 左侧插入 :lpush key value1 value2 value3... 右侧插入: lpush key value1 value2 value3... 在指定元素 ...

  8. Servlet与idea

    1.idea会为每一个Tomcat部署的项目,独立建一份配置文件. 配置文件所在位置 怎么部署的?使用的第三种部署方式(查看虚拟目录) docBase部署项目存放的路径 项目目录和Tomcat部署目录 ...

  9. opencv3.2.0+opencv_contrib-3.2.0+vs2015相关文件的配置

    包含目录:E:\opencvcontrib\opencv\sources\build\install\include\opencv E:\opencvcontrib\opencv\sources\bu ...

  10. SpringBoot--自动配置原理-4个注解

    一.自动配置原理 四个元注解:修饰注解的注解 @Target(ElementType.TYPE) 这个注解用在那个位置上,可以使用在类上,方法上,成员变量上 @Retention(RetentionP ...