AVL平衡二叉查找树实现(C语言版本)
来源:互联网 发布:anyview java 编辑:程序博客网 时间:2024/05/22 08:14
AVT树是每个节点的左子树和右子树的高度最多差 1 的二叉查找树。
(1)AVLTree.h 文件
#ifndef __AVL_TREE_H__#define __AVL_TREE_H__// AVL Tree: Adelson-Vlskii and Landis// 带有平衡条件的二叉查找树// AVT树是每个节点的左子树和右子树的高度最多差 1 的二叉查找树#include "DataType.h"typedef struct AVLTreeNode* AVLTreePt;typedef struct AVLTreeNode AVLTree;struct AVLTreeNode{DataType data;AVLTreePt left;AVLTreePt right;int count;int height;};void TravelAVLTree( AVLTree* T );void ReleaseAVLTree( AVLTree* T ); // 释放 AVT Tree 的空间AVLTree* InsertToAVLTree( DataType X, AVLTree* T); // 向 AVL Tree 中插入数据AVLTree* DeleteDataOfAVLTree( DataType X, AVLTree* T ); // 从 AVL Tree 中删除指定数据元素AVLTree* FindDataInAVLTree( DataType X, AVLTree* T ); // 在 AVL Tree 中查找指定数据元素AVLTree* FindMinInAVLTree( AVLTree* T ); // 从 AVL Tree 中查找值最小节点AVLTree* FindMaxInAVLTree( AVLTree* T ); // 从 AVL Tree 中查找值最大的节点#endif
其中DataType.h内容
#ifndef __DATA_TYPE_H__#define __DATA_TYPE_H__typedef int DataType;#endif
(2)AVLTree.cpp文件
#include "AVLTree.h"#include <stdlib.h>#include <stdio.h>static int max_int( int a, int b ){return (a>b)?a:b;}static int Height( AVLTree* T ){if ( T == NULL )return -1;elsereturn T->height;}static void __travel( AVLTree* T, int deep ){int i;if ( T != NULL ){for ( i = 0; i < deep; ++i ){printf("\t");}printf("%d(%d)\n", T->data, T->count);__travel( T->left, deep+1 );__travel( T->right, deep+1 );}}static AVLTree* LeftSingleRote( AVLTree* T ){AVLTree* P = T->left;T->left = P->right;P->right = T;T->height = max_int( Height(T->left), Height(T->right) ) + 1;P->height = max_int( Height(T->left), Height(T->right) ) + 1;return P;}static AVLTree* RightSingleRote( AVLTree* T ){AVLTree* P = T->right;T->right = P->left;P->left = T;T->height = max_int( Height(T->left), Height(T->right) ) + 1;P->height = max_int( Height(T->left), Height(T->right) ) + 1;return P;}static AVLTree* LeftDoubleRote( AVLTree* T ){T->left = RightSingleRote( T->left );return LeftSingleRote( T );}static AVLTree* RigthDoubleRote( AVLTree* T ){T->right = LeftSingleRote( T->right );return RightSingleRote( T );}// 遍历 AVL Treevoid TravelAVLTree( AVLTree* T ){__travel( T, 0 );}// 向 AVL Tree 中插入数据AVLTree* InsertToAVLTree( DataType X, AVLTree* T ){if ( T == NULL ) // 如果 T 为空,直接插入{T = (AVLTree*)malloc(sizeof(AVLTree));T->data = X;T->right = T->left = NULL;T->count = 1;T->height = 0;}else if ( X < T->data ){T->left = InsertToAVLTree( X, T->left );if ( Height( T->left ) - Height( T->right ) > 1 ){if ( X < T->left->data )T = LeftSingleRote( T );elseT = LeftDoubleRote( T );}}else if ( X > T->data ){T->right = InsertToAVLTree( X, T->right );if ( Height( T->right ) - Height( T->left ) > 1 ){if ( X > T->right->data )T = RightSingleRote( T );elseT = RigthDoubleRote( T );}}else // X == T->data{++T->count;}T->height = max_int( Height(T->left), Height(T->right) ) + 1; return T;}// 释放 AVT Tree 的空间void ReleaseAVLTree( AVLTree* T ){if ( T != NULL ){ReleaseAVLTree( T->left );ReleaseAVLTree( T->right );free( T );T = NULL;}}// 在 AVL Tree 中查找指定数据元素AVLTree* FindDataInAVLTree( DataType X, AVLTree* T ){if ( T == NULL ) // 未找到{return T;}else if ( X == T->data ){return T;}else if ( X < T->data ){return FindDataInAVLTree( X, T->left );}else{return FindDataInAVLTree( X, T->right );}}// 从 AVL Tree 中查找值最小节点AVLTree* FindMinInAVLTree( AVLTree* T ){if ( T == NULL || T->left == NULL ) return T;return FindMinInAVLTree( T->left );}// 从 AVL Tree 中查找值最大的节点AVLTree* FindMaxInAVLTree( AVLTree* T ){if ( T == NULL || T->right == NULL ) return T;return FindMaxInAVLTree( T->right );}// 从 AVL Tree 中删除指定数据元素AVLTree* DeleteDataOfAVLTree( DataType X, AVLTree* T ){AVLTree* P;if ( T == NULL ){return T;}else if ( X == T->data ){if ( T->left == NULL && T->right == NULL ) // 左右子树为空{free( T );return NULL;}else if ( T->left == NULL ) // 右子树非空{P = T;T = T->right;free( P );}else if ( T->right == NULL ) // 左子树非空{P = T;T = T->left;free(P);}else // 左右子树均非空 {P = FindMinInAVLTree( T->right );T->data = P->data;T->count = P->count;T->right = DeleteDataOfAVLTree( P->data, T->right );}}else if ( X < T->data ){T->left = DeleteDataOfAVLTree( X, T->left );}else{T->right = DeleteDataOfAVLTree( X, T->right );}T->height = max_int( Height(T->right), Height(T->left) ) + 1;if ( Height(T->left) - Height(T->right) == 2 ){if ( Height(T->left->left) > Height(T->left->right) )T = LeftSingleRote( T );elseT = LeftDoubleRote( T );}else if ( Height(T->right) - Height(T->left) == 2 ){if ( Height(T->right->right) > Height(T->right->left) )T = RightSingleRote( T );elseT = RigthDoubleRote( T );}return T;}
- AVL平衡二叉查找树实现(C语言版本)
- C语言实现AVL-平衡二叉树
- 二叉平衡树(AVL)-C语言
- 平衡二叉查找树 AVL 的实现
- C语言:平衡二叉树的实现(AVL)
- 平衡二叉查找(AVL)树(C++模板实现)
- 平衡二叉树(AVL树) ----- C语言
- AVL树(平衡二叉查找树)
- AVL树(平衡二叉查找树)
- AVL树(平衡二叉查找树)
- 平衡二叉查找树(AVL)
- 【修改】C实现平衡二叉树---AVL
- 数据结构之 AVL树(平衡二叉树)(C语言实现)
- AVL树(平衡二叉树)的C语言实现及原理
- 数据结构之---C语言实现平衡二叉树(AVL树)
- 平衡二叉树(AVL)的实现,附可运行C语言代码
- 【证明可用】平衡二叉树(avl tree)的C语言实现
- 关于AVL平衡二叉树的c语言实现(函数内部改变指针本身)
- PHP5.0-configure: error: libxml2 version 2.5.10 or greater required
- 第起周任务3
- Bitmap和Drawable相互转换方法
- linux系统文件介绍
- JLINK烧写BIN文件到nand、norflash、SDRAM
- AVL平衡二叉查找树实现(C语言版本)
- CMemoryState的使用
- 送给“苦逼”的IT人系列2:要事第一,关于人生计划以及时间管理
- 为什么镜像卷组中需要3块或是以上的物理卷
- 在线编辑器
- Linux系统目录结构
- EOJ【1006】Prime 和素数有关的水题
- 杭电hdu 1053 Entropy题解
- Android SDK更新以及ADT更新出现问题的解决办法