参考资料:
http://blog.csdn.net/xiaofan086/article/details/8294382
<数据结构与算法分析>-C语言描述 Mark Allens Weiss
承接上个二叉查找树:
/*
* avl.h
*
* Created on: 2016年4月3日
* Author: fay
*/
#ifndef AVL_H_
#define AVL_H_
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
//以下定义Avl树的节点
typedef struct TreeNode
{
ElementType data;
struct TreeNode * left;//定义左孩子
struct TreeNode * right;//定义右孩子
int height;
}*Position,*AvlTree;
AvlTree MakeEmpty(AvlTree T);
/*以下定义树查找操作,找到最大,最小元素*/
Position Find(ElementType x,AvlTree T );
Position FindMax(AvlTree T);
Position FindMin(AvlTree T);
/*以下定义树的插入,删除,返回指定位置的元素*/
AvlTree Insert(ElementType x,AvlTree T );
AvlTree Delete(ElementType x,AvlTree T );
ElementType Retrieve(Position T);
/*定义返回树的高度*/
static int Height(AvlTree T);
/*中序遍历二叉树*/
void InOrderRecur(AvlTree T);
#endif /* AVL_H_ */
/*
* avlTree.c
*
* Created on: 2016年4月3日
* Author: fay
*/
#include "avl.h"
AvlTree MakeEmpty(AvlTree T) {
if (T != 0) {
MakeEmpty(T->left);
MakeEmpty(T->right);
free(T);
}
return 0;
}
Position Find(ElementType X, AvlTree T) {
if (T == 0) {
return 0;
}
if (X < T->data) {
return Find(X, T->left);
} else if (X > T->data) {
return Find(X, T->right);
} else {
return T;
}
}
Position FindMax(AvlTree T) {
if (T == 0) {
return 0;
} else if (T->right != 0) {
return FindMax(T->right);
} else {
return T;
}
}
Position FindMin(AvlTree T) {
if (T == 0) {
return 0;
} else if (T->left != 0) {
return FindMin(T->left);
} else {
return T;
}
}
ElementType Retrieve(Position T) {
return T->data;
}
static int Max(int h1, int h2) {
return h1 > h2 ? h1 : h2;
}
static int Height(Position T) {
if (T == 0) {
return -1;
} else {
return T->height;
}
}
static Position SingleRotateWithLeft(Position K2){
Position K1;
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),Height(K2->right))+1;
return K1;
}
static Position SingleRotateWithRight(Position K1){
Position K2;
K2=K1->right;
K1->right=K2->left;
K2->left=K1;
K1->height=Max(Height(K1->left),Height(K1->right))+1;
K2->height=Max(Height(K1->left),Height(K2->right))+1;
return K1;
}
static Position DoubleRotateWithLeftRight(Position K3){
Position K1=K3->left;
K3->left=SingleRotateWithRight(K1);
return SingleRotateWithLeft(K3);
}
static Position DoubleRotateWithRightLeft(Position K1){
Position K3=K1->right;
K1->right=SingleRotateWithLeft(K3);
return SingleRotateWithRight(K1);
}
/*插入节点需要注意平衡二叉树,任意节点的左右子树的高度差不得大于1*/
AvlTree Insert(ElementType X, AvlTree T) {
//树等于空的情形
if (T == 0) {
T = (AvlTree) malloc(sizeof(struct TreeNode));
if (T == 0) {
} else {
T->data = X;
T->height = 0;
T->left = T->right = 0;
}
} else if (X < T->data) {
//插入节点需要判断左右子树的高度
T->left = Insert(X, T->left);
if (Height(T->left) - Height(T->right) == 2) {
//左左的情形,单旋转
if (X < T->left->data) {
T = SingleRotateWithLeft(T);
} else {
//左右双旋转
T = DoubleRotateWithLeftRight(T);
}
}
} else if (X > T->data) {
T->right = Insert(X, T->right);
if (Height(T->left) - Height(T->right) == 2) {
//右右的情形,单旋转
if (X < T->left->data) {
T = SingleRotateWithRight(T);
} else {
//右左双旋转
T = DoubleRotateWithRightLeft(T);
}
}
}
T->height = Max(Height(T->left), Height(T->right)) + 1;
return T;
}
AvlTree Delete(ElementType X, AvlTree T) {
Position temp;
if (T == 0) {
return 0;
} else if (X < T->data) {
printf(" X < T->data %d ", T->data);
T->left = Delete(X, T->left);
} else if (X > T->data) {
T->right = Delete(X, T->right);
printf(" X > T->data %d ", T->data);
}
/*以下为找到了要删除的节点分为三种情况*/
else if (T->left && T->right) { //要删除的节点有左儿子和右儿子
printf("X == T->data %d", T->data);
temp = FindMin(T->right);
printf("FindMin %d", temp->data);
T->data = temp->data;
//好难理解 妹滴
T->right = Delete(T->data, temp->right);
} else { //只有一个儿子或没有儿子
temp = T;
if (T->left == 0) {
T = T->right;
} else if (T->right == 0) {
T = T->left;
}
free(temp);
}
return T;
}
/*
* 中序遍历输出
*/
void InOrderRecur(AvlTree T) {
static int n = 0;
if (0 != T) {
InOrderRecur(T->left);
printf("%d \n", T->data);
InOrderRecur(T->right);
}
}
/**
* 先根遍历
*/
void PreOrderRecur(AvlTree T) {
static int n = 0;
if (0 != T) {
printf("%d \n", T->data);
PreOrderRecur(T->left);
PreOrderRecur(T->right);
}
}
/*
* functionAvl.c
*
* Created on: 2016年4月3日
* Author: fay
*/
#include"avlTree.c"
#define N 15
int main(void) {
AvlTree T=0;
int i;
int j = 0;
T = MakeEmpty(0 );
for( i = 0; i < N; i++, j = ( j + 7 ) % 50 )
{
printf("j=%d \n",j);
T = Insert( j, T );
}
// puts("插入 4 \n");
// T = Insert( 4, T );
InOrderRecur(T);
printf("================");
printf("height=%d \n",T->height);
InOrderRecur(T);
printf( "Min is %d, Max is %d\n", Retrieve( FindMin( T ) ),
Retrieve( FindMax( T ) ) );
return EXIT_SUCCESS;
}