参考:

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. Python标准库之logging模块

    很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,loggin ...

  2. 深入浅出Mybatis系列七-mapper映射文件配置之insert、update、delete

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 上篇文章<深入浅出Mybatis系列(六)---objectFactory.p ...

  3. Spark Streaming数据限流简述

      Spark Streaming对实时数据流进行分析处理,源源不断的从数据源接收数据切割成一个个时间间隔进行处理:   流处理与批处理有明显区别,批处理中的数据有明显的边界.数据规模已知:而流处理数 ...

  4. Python之三:运算符与表达式

    1.运算符: 1.1.运算符种类: 运算符  名称  说明  例子  + 加    5+4  - 减      *  乘      /  除      //  取整除  商的整数部分  3//2,结果 ...

  5. CSS隐藏元素的五种方法

    1.opacity:0 2.visibility:hidden 3.diaplay:none 4.position:absolute display display属性依照词义真正隐藏元素.将disp ...

  6. canvas特效-文字粒子

    具体的效果 https://www.ui.cn/detail/393461.html 实现类似的动效 要求: 1.文字内容可以自定义 2.粒子的运动轨迹 是曲线,返回是按照 原运动轨迹 3.粒子 堆叠 ...

  7. CSS的文本样式

    CSS的文本样式 1.颜色 2.文本对齐方式 3.首行缩进 4.行高 5.装饰 1. 文本位置 居中: text-align: center; 靠左: text-align: left; 靠右: te ...

  8. nodejs使用promise实现sleep

    个人博客 地址:http://www.wenhaofan.com/article/20181120180225 let sleep = function (delay) { return new Pr ...

  9. JavaScript函数、对象和数组

    一.JavaScript函数 1.定义函数:函数的通用语法如下 function function_name([parameter [, ...]]) { statements; } 由关键字func ...

  10. 04 部署uwsgi web服务器

    1 建立uwsgi软链接 进入虚拟环境,并在虚拟环境中安装uwsgi,建立软链接. $ cd /venv/thvenv/bin $ activate $ pip install uwsgi 2 创建u ...