AVL平衡树的插入例程

/*
**AVL平衡树插入例程
**2014-5-30 11:44:50
*/

avlTree insert(elementType X, avlTree T){
	if(T == NULL){
		T = malloc(sizeof(struct avlTree));
		if(T == NULL) fatalError("Out of space!!!");
		T->element = X; T->height = 0;
		T->left = T->right = NULL;
	}else if(X < T->element){
		T->left = insert(X, T->left);
		if(height(T->left) - height(T->right) == 2){
			if(X < T->left->element)
				T = singleRotateWithLeft(T);
			else T = doubleRotateWithLeft(T);
		}
	}else if(X > T->element){
		T->right = insert(X, T->right);
		if(height(T->right) - height(T->left) == 2){
			if(X > T->right->element)
				T = singleRotateWithRight(T);
			else T = doubleRotateWithRight(T);
		}
	}
	/*--如果X已经存在,那么啥都不用做--*/

	T->height = max(height(T->left), height(T->right)) + 1;
	return T;
}

static position singleRotateWithLeft(position k2){
	position k1 = k2-> left;
	k2->left = k1->right;
	k1->right = k2;

	k2->height = max(height(k2->left), height(k2->right)) + 1;
	k1->height = max(height(k1->left), k2->height) + 1;
	return k1;
}

/*双右左旋就是先对T的右子树左单旋再对T本身右单旋*/
static position 

AVL平衡树的插入例程,布布扣,bubuko.com

时间: 2024-11-05 12:26:09

AVL平衡树的插入例程的相关文章

二叉平衡树的插入和删除操作

1.      二叉平衡树 二叉排序树的时间复杂度和树的深度n有关.当先后插入的结点按关键字有序时,二叉排序树退化为单枝树,平均查找长度为(n+1)/2,查找效率比较低.提高查找效率,关键在于最大限度地降低树的深度n.因此需要在构成二叉排序树的过程中进行“平衡化”处理,使之成为二叉平衡树. 二叉平衡树,又称AVL树.它或者是一棵空树,或者是具有下列性质的树: 1)      具备二叉排序树的所有性质: 2)      左子树和右子树深度差的绝对值不超过1: 3)      左子树和右子树都是二叉

AVL树的插入和删除

一.AVL 树 在计算机科学中,AVL树是最早被发明的自平衡二叉查找树.在AVL树中,任一节点对应的两棵子树的最大高度差为 1,因此它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下的时间复杂度都是 O(log(n)).插入和删除元素的操作则可能需要借由一次或多次树旋转,以实现树的重新平衡. 节点的平衡因子是它的左子树的高度减去它的右子树的高度(有时相反).带有平衡因子 1.0 或 -1 的节点被认为是平衡的.带有平衡因子 -2 或 2 的节点被认为是不平衡的,并需要重新平衡这个树.平衡因

AVL 树的插入、删除、旋转归纳

参考链接: http://blog.csdn.net/gabriel1026/article/details/6311339 之前简单了解过 AVL 树,知道概念但一直没动手实践过.Now AVL 树是二叉搜索树的一种.二叉搜索树的规则就是:每个节点的 left child 都比自己小,right child 都比自己大.而 AVL 的在此之上又加了一个规则:每个节点的 left 深度与 right 深度只差<=1,这样就能充分利用 二叉树的结构,避免出现一个分支走到黑,导致搜索效率变低.如下图

AVL树的插入操作(旋转)图解

=================================================================== AVL树的概念 在说AVL树的概念之前,我们需要清楚二茬搜索树的概念.对于二叉搜索树,我们知道它可以降低查找速率,但是如果一个二叉搜索树退化成一棵只剩单支的搜索树,此时的查找速率就相当于顺序表中查找元素,效率变低,时间复杂度由原来的O(logN)变为O(N). 此时就有了AVL(高度平衡二叉搜索树),从它的名字就能知道它也是一棵二叉搜索树,只是它在插入元素的时候

AVL 平衡树

AVL是一种平衡二叉树,它通过对二叉搜索树中的节点进行旋转使得二叉搜索树达到平衡.AVL在所有的平衡二叉搜索树中具有最高的平衡性. 定义 平衡二叉树或者为空树或者为满足如下性质的二叉搜索树: 左右子树的高度之差绝对值不超过1 左右子树仍然为平衡二叉树 定义平衡因子 BF(x) = x的左子树高度 - x的右子树的高度.平衡二叉树的每个节点的平衡因子只能为-1, 0, 1. 维持平衡思想 若二叉树当前为平衡状态,此时插入/删除一个新的节点,此时有可能造成二叉树不满足平衡条件,此时需要通过对节点进行

AVL平衡树 - 二叉搜索树的推广

AVL树的介绍 实现 1 旋转 LL左左 RR右右 LR左右 RL右左 2 插入 3 删除 性能 完整代码和参考资料 1. AVL树的介绍 AVL树是根据它的发明者G.M. Adelson-Velsky和E.M. Landis命名的. 它是最先发明的自平衡二叉查找树,也被称为高度平衡树.相比于"二叉查找树",它的特点是:AVL树中任何节点的两个子树的高度最大差别为1. 如上图(左):非AVL树,如对节点9,左子树高度为0,右子树高度为2 如上图(由):AVL树,对任意节点的两个子树高度

AVL树的插入与删除

AVL 树要在插入和删除结点后保持平衡,旋转操作必不可少.关键是理解什么时候应该左旋.右旋和双旋.在Youtube上看到一位老师的视频对这个概念讲解得非常清楚,再结合算法书和网络的博文,记录如下. 1.1 AVL 的旋转 一棵AVL树是其每个节点的左子树和右子树的高度差最多为1的二叉查找树(空树高度定义为-1).AVL树插入和删除时都可能破坏AVL的特性,可以通过对树进行修正来保证特性,修正方法称为旋转. 下面以4个插入操作为例,说明不同旋转对应的场景. 1.1.1 LL-R 插入结点为6,沿着

AVL平衡树(详解)-JAVA版本

平衡二叉树在进行插入操作的时候可能出现不平衡的情况,AVL树即是一种自平衡的二叉树. 它通过旋转不平衡的节点来使二叉树重新保持平衡,并且查找.插入和删除操作在平均和最坏情况下时间复杂度都是O(log n) AVL树的旋转一共有四种情形,注意所有旋转情况都是围绕着使得二叉树不平衡的第一个节点展开的. RBT VS AVL: 实际上插入AVL树和红黑树的速度取决于你所插入的数据.如果你的数据分布较好,则比较宜于采用AVL树(例如随机产生系列数), 但是如果你想处理比较杂乱的情况,则红黑树是比较快的,

AVL平衡树

/* 1.插入: 使用了一个s数组来保存根节点到插入节点的路线 情况: (1)空树,直接插入,return (2)关键字相同,覆盖原来的值,return (3)插入后,不失衡 那么就要拿出s数组的值来改变这条路线的平衡因子. (4)插入后,失衡 调用AVL函数. AVL旋转有分为4种 ll rr rl lr旋转(在设置平衡因子的时候,rl和lr旋转又有3种子情况) 2.查找:(未实现) 不同的key可能获取一样的num_key,那么继续向左走 3.删除:(未实现) 情况分为3种 (1)节点的平衡