AVL平衡二叉查找树实现(C语言版本)

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;
	else
		return 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 Tree
void 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 );
			else
				T = 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 );
			else
				T = 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 );
		else
			T = LeftDoubleRote( T );
	}
	else if ( Height(T->right) - Height(T->left) == 2 )
	{
		if ( Height(T->right->right) > Height(T->right->left) )
			T = RightSingleRote( T );
		else
			T = RigthDoubleRote( T );
	}
	return T;
}














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
平衡二叉排序树(AVL树)是一种自平衡的二叉搜索树,保证在最坏情况下的时间复杂度为O(log N)。下面是C语言实现平衡二叉排序树的基本步骤: 1. 定义AVL树结构体节点: ```c typedef struct AVLNode { int data; // 存储数据 int height; // 节点高度 struct AVLNode *left; // 左子节点指针 struct AVLNode *right; // 右子节点指针 } AVLNode; ``` 2. 定义AVL树结构体: ```c typedef struct AVLTree { AVLNode *root; // 根节点指针 } AVLTree; ``` 3. 实现计算节点高度的函数: ```c int height(AVLNode *node) { if (node == NULL) { return 0; } return node->height; } ``` 4. 实现计算节点平衡因子的函数: ```c int balance_factor(AVLNode *node) { if (node == NULL) { return 0; } return height(node->left) - height(node->right); } ``` 5. 实现AVL树的左旋和右旋操作: ```c AVLNode *left_rotate(AVLNode *node) { AVLNode *new_root = node->right; node->right = new_root->left; new_root->left = node; node->height = max(height(node->left), height(node->right)) + 1; new_root->height = max(height(new_root->left), height(new_root->right)) + 1; return new_root; } AVLNode *right_rotate(AVLNode *node) { AVLNode *new_root = node->left; node->left = new_root->right; new_root->right = node; node->height = max(height(node->left), height(node->right)) + 1; new_root->height = max(height(new_root->left), height(new_root->right)) + 1; return new_root; } ``` 6. 实现AVL树的插入操作: ```c AVLNode *insert(AVLNode *node, int data) { if (node == NULL) { AVLNode *new_node = (AVLNode *)malloc(sizeof(AVLNode)); new_node->data = data; new_node->height = 1; new_node->left = NULL; new_node->right = NULL; return new_node; } if (data < node->data) { node->left = insert(node->left, data); } else { node->right = insert(node->right, data); } node->height = max(height(node->left), height(node->right)) + 1; int factor = balance_factor(node); if (factor > 1 && data < node->left->data) { return right_rotate(node); } if (factor > 1 && data > node->left->data) { node->left = left_rotate(node->left); return right_rotate(node); } if (factor < -1 && data > node->right->data) { return left_rotate(node); } if (factor < -1 && data < node->right->data) { node->right = right_rotate(node->right); return left_rotate(node); } return node; } ``` 7. 实现AVL树的查找操作: ```c AVLNode *search(AVLNode *node, int data) { if (node == NULL) { return NULL; } if (data == node->data) { return node; } if (data < node->data) { return search(node->left, data); } else { return search(node->right, data); } } ``` 8. 最后,定义AVL树的初始化和销毁操作: ```c void init_avl_tree(AVLTree *tree) { tree->root = NULL; } void destroy_avl_tree(AVLNode *node) { if (node == NULL) { return; } destroy_avl_tree(node->left); destroy_avl_tree(node->right); free(node); } ``` 这样就完成了平衡二叉排序树的建立。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值