# AVL树插入删除

AVL树是一种平衡二叉树，其每个节点的左右子树高度最多差1，空树高度定为－1，当左右的高度超过1，即失去了平衡，不是AVL树了。

private static class AVLNode<AnyType>{
AVLNode (AnyType element)
{this(element ,null,null);}
AVLNode(AnyTape element,AVLNode<AnyType> left,AVLNode<AnyType> right){
this.element = element;
this.left = left;
this.right = right;
}
AnyTape element;
AVLNode<AnyType> left;
AVLNode<AnyType> right;
int height;
}

1.对于ｔ的左儿子的左子树进行插入－＞单旋转

2.对于ｔ的左儿子的右子树进行插入－＞双旋转

3.对于ｔ的右儿子的左子树进行插入－＞双旋转

4.对于ｔ的右儿子的右子树进行插入－＞单旋转

private int height(AVLNode<AnyType> t){
return t == null ? -1 : t.height;
}

1.左－左：单旋,右旋

private AVLNode<AnyType> rotateRight(AVLNode<AnyType> k2){
AVLNode<AnyType> k1 = k2.left;
k2.left = k1.right;
k2.height = Maht.max(height(k2.left),height(k2.right))+1;
k1.height = Maht.max(height(k1.left),k2.height)+1;
return k1;
}
2.左－右：双旋转,先左后右

private AVLNode<AnyType> doubleRight(AVLNode<AnyType> k3){
k3.left = rotateLeft(k3.left);
return rotateRight(k3);
}


3.右－左：双旋转,先右后左

private AVLNode<AnyType> doubleLeft(AVLNode<AnyType> k3){
k3.right = rotateRightk3.right);
return rotateLeft(k3);
}

4.右－右：单旋，左旋

private AVLNode<AnyType> rotateLeft(AVLNode<AnyType> k2){
AVLNode<AnyType> k1 = k2.left;
k2.left = k1.right;
k2.height = Maht.max(height(k2.left),height(k2.right))+1;
k1.height = Maht.max(height(k1.left),k2.height)+1;
return k1;
}

private AVLNode<AnyType> insert(AnyType x,AVLNode<AnyType>t){
if(t == null)
return new AVLNode<>(x,null,null);
int result = x.compareTo(t.element);
if( result < 0)		//如果X小于节点值，则在左子树插入，递归更新
t.left = insert(x,t.left);
else if( result > 0)	//如果X大于节点值，则在右子树插入，递归
t.right = insert(x,t.right);
return balance(t);
}
private static final int balance_num = 1;
private AVLNode<AnyType> balance(AVLNode<AnyType>t){
if(t == null)
return t;
if(height(t.left) - height(right) > balance_num){
if(height(t.left.left) > height(t.left.right))  //左-左
t = rotateRight(t);
else
t = doubleRight(t);	//左-右
}else{
if(height(t.right.right) > height(t.right.left))	//右-左
t = rotateLeft(t);
else
t = doubleLeft(t);	//右-左
}

t.height = Math.max(height(t.left),height(t.right))+1;
return t;
}


private AVLNode<AnyType> remove(AnyType x,AVLNode<AnyType>t){
if(t == null)
return new AVLNode<>(x,null,null);
int result = x.compareTo(t.element);
if( result < 0)		//如果X小于节点值，则在左子树删除，递归更新
t.left = insert(x,t.left);
else if( result > 0)	//如果X大于节点值，则在右子树删除，递归
t.right = insert(x,t.right);
else if(t.left != null && t.right != null){
t.element = findMin(t.right).element;	//找到右子树最小值
t.right = remove(t.element,t.right)		//删除右子树最小值原来的位置
}
else
t = (t.left != null)?t.left:t.right;	//如果是一个儿子或者没有，哪个儿子不为空就返回哪个儿子
return balance(t);
}


• 本文已收录于以下专栏：

## avl树的判断与插入删除结点

• 2008-10-29 21:29
• 12KB
• 下载

## AVL树 创建 插入 删除

• 2012-03-06 10:44
• 317KB
• 下载

## avl树的插入删除

• 2008-04-03 20:56
• 14KB
• 下载

## 手写代码 AVL 二叉平衡树（插入 删除）

avl是一种平衡二叉树，其难点在于插入和删除，这两个操作可能会导致avl树不再满足平衡条件（左右子树的高度相差小于2），所以需要旋转来重新回到平衡状态。本文实现的插入与《数据结构与算法分析–C语言描述...

## AVL树的插入与删除(均为递归实现)

AVL树是带有平衡条件的二叉查找树.这个平衡条件必须要容易保持,而且它必须保证树的深度是O(lonN).一颗AVL树是其每个节点的左子树和右子树的高度最多差一的二叉查找树. 主要介绍插入算法和删除算法...

## AVL树的插入删除操作

// Demo2.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include using namespace std; #define max(a,...

## avl树的插入操作和删除操作

avl树相比于搜索二叉树每个结点是多了个平衡因子bf，avl树时时刻刻要维持树中的每个结点的平衡因子的绝对值小于等于１． avl树的插入操作： avl树因为要保证每个结点的平衡因子要时时刻刻都符合要求...

## 平衡二叉搜索树（AVL）插入和删除的java代码实现

AVL树节点的声明代码： package geeksgeeks.avl; public class TreeNode {        int key&...

举报原因： 您举报文章：深度学习：神经网络中的前向传播和反向传播算法推导 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)