[Data structures]Balance binary search tree (AVL)
#include <stdio.h>
#include <stdlib.h>
typedef struct _BinaryTree{
	int key;
	int bf;
	struct _BinaryTree *left;
	struct _BinaryTree *right;
}BinaryTree;
void R_Rotate(BinaryTree **T)
{
	BinaryTree *lc;
	lc = (*T)->left;
	(*T)->left = lc->right;
	lc->right = (*T);
	(*T) = lc;	
}
void L_Rotate(BinaryTree **T)
{
	BinaryTree *lc;
	lc = (*T)->right;
	(*T)->right = lc->left;
	lc->left = (*T);
	(*T) = lc;
}
void LeftBalance(BinaryTree **T)
{
	BinaryTree *lc = (*T)->left;
	BinaryTree *rd = NULL;
	switch(lc->bf){
		case 1:
			(*T)->bf = lc->bf = 0;
			R_Rotate(T);
			break;
		case -1:
			rd = lc->right;
			switch(rd->bf){
				case 1:
					(*T)->bf = -1;
					lc->bf = 0;
					break;
				case 0:
					(*T)->bf = lc->bf = 0;
					break;
				case -1:
					(*T)->bf = 0;
					lc->bf = 1;
					break;
			}
			rd->bf = 0;
			L_Rotate(&(*T)->left);
			R_Rotate(T);
			break;
	}	
}
void RightBalance(BinaryTree **T)
{
	BinaryTree *rc = (*T)->right;
	BinaryTree *ld = NULL;
	switch(rc->bf){
		case 1:
			ld = rc->left;
			switch(ld->bf){
				case 1:
					(*T)->bf = 0;
					rc->bf = -1;
					break;
				case 0:
					(*T)->bf = rc->bf = 0;
					break;
				case -1:
					(*T)->bf = 1;
					rc->bf = 0;
					break;
			}
			ld->bf = 0;
			R_Rotate(&(*T)->right);
			L_Rotate(T);
			break;
		case -1:
			(*T)->bf = rc->bf = 0;
			L_Rotate(T);
			break;
	}
}
int InsertAVL(BinaryTree **T, int key, int *taller)
{
	if(*T == NULL){
		(*T) = (BinaryTree *)malloc(sizeof(BinaryTree));
		(*T)->key = key;
		(*T)->left = (*T)->right = NULL;
		(*T)->bf = 0;
		*taller = 1;
		return 1;
	}else if((*T)->key == key){
		*taller = 0;
		return 0;
	}else if( key < (*T)->key){
		if( !InsertAVL( &(*T)->left, key, taller) ){
			return 0;
		}
		if(*taller){
			switch((*T)->bf){
				case 1:
					LeftBalance(T);
					*taller = 0;
					break;
				case 0:
					(*T)->bf = 1;
					*taller = 1;
					break;
				case -1:
					(*T)->bf = 0;
					*taller = 0;
					break;
			}
		}
	}else{
		if( !InsertAVL( &(*T)->right, key, taller) ){
			return 0;
		}
		if(*taller){
			switch((*T)->bf){
				case 1:
					(*T)->bf = 0;
					*taller = 0;
					break;
				case 0:
					(*T)->bf = -1;
					*taller = 1;
					break;
				case -1:
					RightBalance(T);
					*taller = 0;
					break;
			}
		}
	}
}
void printTree(BinaryTree *T){
	if(T == NULL){
		return;
	}
	printf(" %d", T->key );
	printf("(");
	if(T->left != NULL){
		printTree(T->left);
	}
	printf(",");
	if(T->right != NULL){
		printTree(T->right);
	}
	printf(")");
}
void main()
{
	int seq[] = { 0,  13, 24, 37, 90, 53 }; 
	int n = sizeof(seq)/sizeof(int);
	int i;
	BinaryTree *T = NULL;
	int taller;
	printf("Original data:\n");
	for (i=0; i<n; i++) {
		printf("%d\t", seq[i]);
	}	
	printf("\n");
	printf("Insert balance binary search tree:\n");
	for(i=1;i<n;i++){
		InsertAVL(&T, seq[i], &taller);
	}
	printf("\n");
	printf("Print the tree:\n");
	printTree(T);
	printf("\n");
}	
		
		    
		日历
最新微语
- 有的时候,会站在分叉路口,不知道向左还是右
2023-12-26 15:34
 - 繁花乱开,鸟雀逐风。心自宁静,纷扰不闻。
2023-03-14 09:56
 - 对于不可控的事,我们保持乐观,对于可控的事情,我们保持谨慎。
2023-02-09 11:03
 - 小时候,
暑假意味着无忧无虑地玩很长一段时间,
节假意味着好吃好喝还有很多长期不见的小朋友来玩...
长大后,
这是女儿第一个暑假,
一个半月...
2022-07-11 08:54
 - Watching the autumn leaves falling as you grow older together
2018-10-25 09:45
 
分类
最新评论
- Goonog	
i get it now :) - 萧	
@Fluzak:The web host... - Fluzak	
Nice blog here! Also... - Albertarive	
In my opinion you co... - ChesterHep	
What does it plan? - ChesterHep	
No, opposite. - mojoheadz	
Everything is OK!... - Josephmaigh	
I just want to say t... - ChesterHep	
What good topic - AnthonyBub	
Certainly, never it ... 
发表评论: