# [数据结构]10.4实现avl Tree的插入和删除操作。

//**********************************************************插入函数****************************************************

template<class Record>
Error_code AVL_tree<Record>::insert(const Record & new_data)
{
bool taller;
return avl_insert(root, new_data, taller);
}

template<class Record>
Error_code AVL_tree<Record>::avl_insert(Binary_node<Record>*& sub_root, const Record & new_data, bool & taller)
{
if (sub_root == NULL) {
sub_root = new AVL_node<Record>(new_data);
taller = true;
return success;
}
else if (sub_root->data == new_data) {
taller = false;
return duplicate_error;
}
else if (sub_root->data > new_data) {
Error_code result = avl_insert(sub_root->left_child, new_data, taller);
if (taller == true) {
switch (sub_root->get_balance())
{
case left_higher:
left_balance(sub_root);
taller = false;
break;
case equal_height:
sub_root->set_balance(left_higher);
break;
case right_higher:
sub_root->set_balance(equal_height);
taller = false;
break;
}
}
return result;
}
else {
Error_code result = avl_insert(sub_root->right_child, new_data, taller);
if (taller == true) {
switch (sub_root->get_balance())
{
case left_higher:
sub_root->set_balance(equal_height);
taller = false;
break;
case equal_height:
sub_root->set_balance(right_higher);
break;
case right_higher:
right_balance(sub_root);
taller = false;
break;
}
}
return result;
}
}

//*******************************************************************删除函数********************************************************
template<class Record>
Error_code AVL_tree<Record>::remove(Record & old_data)
{
bool shorter = true;
return avl_remove(root, old_data, shorter);
}

template<class Record>
Error_code AVL_tree<Record>::avl_remove(Binary_node<Record>*& sub_root, Record & new_data, bool & shorter)
{
Error_code result;
if (sub_root == NULL) {
shorter = false;
return not_present;
}
else if (new_data == sub_root->data) {
Binary_node<Record>*to_delete = sub_root;
if (sub_root->right_child == NULL) {
sub_root = sub_root->left_child;
shorter = true;
delete to_delete;
return success;
}
else if (sub_root->left_child == NULL) {
sub_root = sub_root->right_child;
shorter = true;
delete to_delete;
return success;
}
else {
to_delete = sub_root->left_child;
Binary_node<Record> *parent = sub_root;
while (!to_delete->right_child) {
parent = to_delete;
to_delete = to_delete->left_child;
}
sub_root->data = to_delete->data;
new_data = to_delete->data;
delete to_delete;
}
}
if (new_data < sub_root->data) {
result = avl_remove(sub_root->left_child, new_data, shorter);
if (shorter == true) {
switch (sub_root->get_balance())
{
case left_higher:
sub_root->set_balance(equal_height);
break;
case equal_height:
sub_root->set_balance(right_higher);
break;
case right_higher:
shorter = right_balance2(sub_root);
break;
}
}
}
if (new_data > sub_root->data) {
result = avl_remove(sub_root->right_child, new_data, shorter);
if (shorter == true) {
switch (sub_root->get_balance())
{
case left_higher:
shorter=left_balance2(sub_root);
break;
case equal_height:
break;
sub_root->set_balance(left_higher);
case right_higher:
sub_root->set_balance(equal_height);
break;
}
}
}
return result;
}


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

## 数据结构与算法——AVL树简介

AVL树简介
• Linux_ever
• 2016年03月27日 22:43
• 1463

## 【数据结构】平衡二叉树[AVL树](一)——插入

AVL 树是带有平衡条件的二叉查找树，所谓的平衡条件就是每个节点的左子树和右子树的高度最大差别为1。平衡二叉树的实现大部分过程和二叉查找树是一样的，区别在于要时刻保持树的平衡，所以在插入和删除之后要添...
• yeswenqian
• 2014年03月26日 17:37
• 4383

## 数据结构&&AVL树原理、插入操作详解及实现

AVL树原理、插入数据原理、实现。
• sp_programmer
• 2014年12月08日 23:59
• 2865

## AVL Tree 平衡二叉树基本插入删除节点功能的实现

• anialy
• 2012年09月18日 20:40
• 10971

## 数据结构（Java语言）——AVLTree简单实现

• zhang_zp2014
• 2015年08月18日 21:44
• 762

## AVL树进行插入的非递归函数

• qq789045
• 2016年04月23日 12:13
• 949

## AVL树的旋转、插入、删除及遍历C语言实现

MARK一篇关于AVL树的博客文章：数据结构图文解析之：AVL树详解及C++模板实现 有时间在写~...
• gl486546
• 2016年12月13日 08:58
• 500

## AVL树插入删除算法详解（有图） -- C++语言实现

• FreeeLinux
• 2016年08月14日 21:42
• 2821

## AVL树的插入与删除

AVL树是一种高度平衡的二叉搜索树，其每一个结点的左树高和右树高相差不大于1。这个性质使得AVL树的搜索效率要比普通的二叉搜索树要高，因为对于一组递增的数组，其构成的二叉搜索树会是一个链表，搜索时间复...
• Ivan_zgj
• 2016年05月25日 11:00
• 7979

## AVL树的插入与删除操作

AVL树是一种较老的数据结构，它的出现是为了解决了二叉查找树在最坏情况下的插入结果。 二叉查找树（以下称为二叉树）如果能以较好的插入序列来创建，使得树的结构趋于平衡，则其大部分操作都可以O(logN)...
• pililipalalar
• 2016年07月22日 20:30
• 1456

举报原因： 您举报文章：[数据结构]10.4实现avl Tree的插入和删除操作。 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)