Python实现AVL树
参考:
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树的更多相关文章
- AVL树Python实现(使用递推实现添加与删除)
# coding=utf-8 # AVL树的Python实现(树的节点中包含了指向父节点的指针) def get_height(node): return node.height if node el ...
- AVL树Python实现
# coding=utf-8 # AVL树Python实现 def get_height(node): return node.height if node else -1 def tree_mini ...
- AVL树的python实现
AVL树是带有平衡条件的二叉查找树,一般要求每个节点的左子树和右子树的高度最多差1(空树的高度定义为-1). 在高度为h的AVL树中,最少的节点数S(h)由S(h)=S(h-1)+S(h-2)+1得出 ...
- AVL树插入(Python实现)
建立AVL树 class AVLNode(object): def __init__(self,data): self.data = data self.lchild = None self.rchi ...
- python常用算法(5)——树,二叉树与AVL树
1,树 树是一种非常重要的非线性数据结构,直观的看,它是数据元素(在树中称为节点)按分支关系组织起来的结构,很像自然界中树那样.树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形 ...
- 【数据结构与算法Python版学习笔记】树——平衡二叉搜索树(AVL树)
定义 能够在key插入时一直保持平衡的二叉查找树: AVL树 利用AVL树实现ADT Map, 基本上与BST的实现相同,不同之处仅在于二叉树的生成与维护过程 平衡因子 AVL树的实现中, 需要对每个 ...
- AVL树探秘
本文首发于我的公众号 Linux云计算网络(id: cloud_dev) ,专注于干货分享,号内有 10T 书籍和视频资源,后台回复 「1024」 即可领取,欢迎大家关注,二维码文末可以扫. 一.AV ...
- 数据结构中的树(二叉树、二叉搜索树、AVL树)
数据结构动图展示网站 树的概念 树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>=1)个有限节点组成一个具有 ...
- 算法与数据结构(十一) 平衡二叉树(AVL树)
今天的博客是在上一篇博客的基础上进行的延伸.上一篇博客我们主要聊了二叉排序树,详情请戳<二叉排序树的查找.插入与删除>.本篇博客我们就在二叉排序树的基础上来聊聊平衡二叉树,也叫AVL树,A ...
随机推荐
- python基础(1):第一个python程序的编写
1.第一个python编程 1.1 python的安装 1> https://www.python.org/ 进入python官网,选择目标版本进行download 2> 点击setup ...
- ubuntu设置ulimit
centos系统的设置ulimit的时候是直接修改/etc/security/limits.conf文件,但是在ubuntu中却不行, ubuntu先修改/etc/security/limits.co ...
- 852. spfa判断负环
给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你判断图中是否存在负权回路. 输入格式 第一行包含整数n和m. 接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点 ...
- CSS-使用CSS样式的方式
1.HTML<!DOCTYPE>声明标签 (1)定义和用法 <!DOCTYPE>声明必须是HTML文档的第一行,位于<html>标签之前. <!DOCTYPE ...
- CentOS 安装后的常用配置
镜像配置 CentOS系统的镜像配置文件路径在 /etc/yum.repos.d/CentOS-Base.repo, 将镜像内容copy到 CentOS-Base.repo中 然后运行 yum mak ...
- 关于向sql中插入datetime部分问题总结
非int型数据要加单引号, 用format格式化当前时间后用String插入即可 读取时用时间戳读取datetime或转化为string存储 读 public static String gainTi ...
- [LGR-054]洛谷10月月赛II
浏览器 结论popcnt(x^y)和popcnt(x)+popcnt(y)的奇偶性相同. 然后就是popcnt为奇数的乘为偶数的.预处理一下\(2^{16}\)次方以内的popcnt,直接\(O(1) ...
- Python入门8 —— 逻辑运算符补充
一:优先级:not > and > or 1.not与紧跟其后的那个条件是不可分割的 2.如果条件语句全部由纯and.或纯or链接,按照从左到右的顺序依次计算即可 print(True a ...
- 洛谷P1086 花生采摘
https://www.luogu.org/problem/P1086 #include <bits/stdc++.h> using namespace std; typedef long ...
- maven构建错误 RSA premaster secret error: SunTls12RsaPremasterSecret KeyGenerator not available
转载地址:https://blog.csdn.net/daydayuptiantian/article/details/78763035 错误信息前面显示的是:Failed to execute go ...