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

原创 2016年06月01日 19:15:07
//**********************************************************插入函数****************************************************

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
  • Linux_ever
  • 2016年03月27日 22:43
  • 1463

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

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

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

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

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

简述: 实现AVL 树,主要是两个功能 : 插入某节点和删除某节点 AVL Tree的定义, 1. 是一棵二叉搜索树(故而每个节点是惟一的, 如果出现重复数字会破坏平衡树的算法) 2....
  • anialy
  • anialy
  • 2012年09月18日 20:40
  • 10971

数据结构(Java语言)——AVLTree简单实现

AVL(Adelson-Velskii and Landis)树是带有平衡条件的二叉查找树。这个平衡条件必须要容易保持,而且它保证树的深度须是o(logN)。最简单的想法是要求左右子树具有相同的高度,...
  • zhang_zp2014
  • zhang_zp2014
  • 2015年08月18日 21:44
  • 762

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

数据结构与算法分析——c语言描述 练习4.19  答案 挺有意思的。改递归为非递归。其实原理还是一样,都用了栈。 AvlTree insert(ElementType X, Avl...
  • qq789045
  • qq789045
  • 2016年04月23日 12:13
  • 949

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

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

AVL树插入删除算法详解(有图) -- C++语言实现

一:AVL树介绍 AVL树本质上还是一棵二叉搜索树,它的特点是: 1.本身首先是一棵二叉搜索树。 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。在本文中用分别用-1,0...
  • FreeeLinux
  • FreeeLinux
  • 2016年08月14日 21:42
  • 2821

AVL树的插入与删除

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

AVL树的插入与删除操作

AVL树是一种较老的数据结构,它的出现是为了解决了二叉查找树在最坏情况下的插入结果。 二叉查找树(以下称为二叉树)如果能以较好的插入序列来创建,使得树的结构趋于平衡,则其大部分操作都可以O(logN)...
  • pililipalalar
  • pililipalalar
  • 2016年07月22日 20:30
  • 1456
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[数据结构]10.4实现avl Tree的插入和删除操作。
举报原因:
原因补充:

(最多只允许输入30个字)