`
hojor
  • 浏览: 109179 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

AVL树实现

阅读更多

avl树是其每个节点的左子树和右子树的高度最多差1的二叉查找树。当在一棵avl树中插入节点的时候,很可能把avl树的平衡给破坏掉,在不平衡的情况下,可以通过对树做单次旋转或者复杂些的双旋转来处理。具体的旋转方法Google去 O(∩_∩)O,这里就不做详细介绍啦。下面仅给已实现的avl树的代码。

/*====================*\
 |     AvlTree.h      |
\*====================*/

#ifndef _AVL_TREE_H_
#define _AVL_TREE_H_
#define ElementType int
#define Max(a,b) (a)>(b)?(a):(b)

struct AvlNode;
typedef struct AvlNode * Position;
typedef struct AvlNode * AvlTree;

//释放树空间
void ClearTree(AvlTree t);
//计算节点的高度
int Height(Position p);
//插入节点
AvlTree Insert(ElementType x,AvlTree t);
//先序遍历
void Preorder_TreePrint(AvlTree t);
//中序遍历
void Inorder_TreePrint(AvlTree t);
//后序遍历
void Postorder_TreePrint(AvlTree t);

//针对左子树做单旋转
static Position SingleRotateWithLeft(Position k2);
//针对右子树做单旋转
static Position SingleRotateWithRight(Position k2);
//针对左子树做双旋转
static Position DoubleRotateWithLeft(Position k3);
//针对右子树做双旋转
static Position DoubleRotateWithRight(Position k3);

#endif

//AVL树结构体
struct AvlNode {
	ElementType Element;
	AvlTree Left;
	AvlTree Right;
	int Height;
};

/*====================*\
 |     AvlTree.c      |
\*====================*/

#include "AvlTree.h"
#include <stdio.h>
#include <stdlib.h>

//清空树
void ClearTree(AvlTree t)
{
	if(t!=NULL)
	{
		ClearTree(t->Left);
		ClearTree(t->Right);
		free(t);
	}
}
//先序遍历
void Preorder_TreePrint(AvlTree t)
{
	if(t!=NULL)
	{
		printf("%d(%d) \n",t->Element,t->Height);
		Preorder_TreePrint(t->Left);
		Preorder_TreePrint(t->Right);
	}
}
//中序遍历
void Inorder_TreePrint(AvlTree t)
{
	if(t!=NULL)
	{
		Inorder_TreePrint(t->Left);		
		printf("%d(%d) \n",t->Element,t->Height);
		Inorder_TreePrint(t->Right);
	}
}
//后续遍历
void Postorder_TreePrint(AvlTree t)
{
	if(t!=NULL)
	{
		Postorder_TreePrint(t->Left);
		Postorder_TreePrint(t->Right);
		printf("%d(%d) \n",t->Element,t->Height);
	}
}
//插入节点
AvlTree Insert(ElementType x,AvlTree t)
{
	if (t == NULL) 
	{
		t = (AvlTree)malloc(sizeof(struct AvlNode));
		if (t == NULL)
		{
			printf("out of space!!\n");
		}
		else
		{
			t->Element = x;
			t->Left = NULL;
			t->Right = NULL;
			t->Height = 0;
		}
	}
	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);
			}
		}
	}

	t->Height = Max(Height(t->Left),Height(t->Right))+1;

	return t;
}
//算节点的高度
int Height(Position p)
{
	if(p == NULL)
		return 0;
	else
		return Max(Height(p->Left),Height(p->Right))+1;
}


//针对左子树做单旋转
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(k1->Right))+1;

	return k1;
}
//针对右子树做单旋转
static Position SingleRotateWithRight(Position k2)
{
	Position k1;

	k1 = k2->Right;
	k2->Right = k1->Left;
	k1->Left = k2;

	k2->Height = Max(Height(k2->Left),Height(k2->Right))+1;
	k1->Height = Max(Height(k1->Left),Height(k1->Right))+1;

	return k1;
}
//针对左子树做双旋转
static Position DoubleRotateWithLeft(Position k3)
{
	k3->Left = SingleRotateWithRight(k3->Left);
	return SingleRotateWithLeft(k3);
}
//针对右子树做双旋转
static Position DoubleRotateWithRight(Position k3)
{
	k3->Right = SingleRotateWithLeft(k3->Right);
	return SingleRotateWithRight(k3);
}

/*====================*\
 |     main.c         |
\*====================*/
#include "AvlTree.h"
#include <stdio.h>
int main()
{
	int i = 0;
	AvlTree at = NULL;
	for(i=0;i<10;i++)
		at = Insert(i,at);
	Preorder_TreePrint(at);
	ClearTree(at);
	return 0;
}

 

分享到:
评论

相关推荐

    avl树实现hash表

    在本项目中,我们将讨论如何结合这两种数据结构,利用avl树实现哈希表,以达到更好的性能效果。 首先,让我们了解一下avl树。avl树是一种自平衡二叉搜索树(BST),它的特点是任何节点的两个子树的高度最大差别不...

    数据结构avl树实现

    AVL树是一种自平衡二叉查找树(Self-Balancing Binary Search Tree),由G. M. Adelson-Velsky和E. M. Landis在1962年提出,因此得名AVL树,它是最早的自平衡二叉查找树之一。在AVL树中,任意节点的两个子树的高度差...

    一个可以查找中位数的AVL树实现

    综上所述,"一个可以查找中位数的AVL树实现"涉及到的IT知识点包括AVL树的基本概念、平衡因子、旋转操作、节点计数处理、中位数查找算法以及在实际应用中的性能优化。理解并掌握这些知识点,将有助于开发高效的数据...

    AVL树实现的映射

    总之,AVL树实现的映射容器是一种高效的数据结构,适用于需要快速查找、插入和删除键值对的场景。相比于标准库中的红黑树实现,AVL树在保持平衡方面更严格,可能在某些操作上表现得更快,但实现和维护也更为复杂。

    采用AVL树实现简单登入系统

    在“采用AVL树实现简单登入系统”中,AVL树可能被用来高效地存储和检索用户账户信息。 `menu.cpp`和`menu.h`可能包含了程序的菜单系统,用于与用户交互,提供登录、注册等操作。这些文件可能定义了菜单结构和相关的...

    数据结构-用户登录实验-二叉查找树AVL树实现

    实验报告可能会详细解释这些操作的步骤,包括如何构建二叉查找树,如何实现AVL树的旋转算法,以及如何在实际应用中使用这些数据结构。此外,报告可能还会包含实验结果的分析,比如不同操作的运行时间比较,以及不...

    MFC 电话薄 通讯录 AVL树快速搜索

    在"PhoneBook"这个项目中,文件名可能包含如"Contact.h"(联系人信息类)、"AVLTree.h"(AVL树实现)、"PhoneBookDlg.h"(主对话框类)和"PhoneBookView.h"(视图类)等。这些文件将分别定义各个组件的接口和实现,...

    AVL树的C++实现

    AVL树是一种自平衡的...总结来说,AVL树的C++实现是一个包含节点类、树类和相关操作实现的过程。通过理解和实现这个过程,你可以深入理解自平衡二叉搜索树的工作原理,并能够灵活地在自己的项目中应用这些数据结构。

    Linux下基于C的Avl树实现

    linux下基于C的avl树实现,插入,删除,查找,输出,检查是否平衡等,

    AVL树C++实现

    学习AVL树的算法实现,使用c++在vc6.0中进行相应的算法实现,对正在学习算法的孩子有帮助

    C++平衡Avl树实现.zip

    在这篇文章中,我们将深入探讨C++实现AVL树的关键知识点。 首先,我们需要理解AVL树的基本概念。AVL树是一种特殊的二叉搜索树,其特点是每个节点的两个子树的高度差不超过1,这确保了AVL树的高度平衡。这种平衡性...

    数据结构课程设计AVL树实现及其分析实验报告.pdf

    在数据结构课程设计中,实现AVL树主要包括以下几个关键部分: 1. **AVL树的性质**: - **平衡因子**:每个节点的平衡因子是其左子树的高度减去右子树的高度,平衡因子的绝对值不超过1是AVL树的基本条件。 - **...

    基于Qt和Avl树实现登录系统【100013012】

    通过实现这样一个登录系统,学生可以深入理解Qt的图形界面设计和Avl树的数据结构及其应用,同时锻炼到软件工程中的需求分析、设计、编码和测试等各个环节。 总结来说,这个项目结合了GUI开发和数据结构两大主题,...

    avl树的删除、插入、平衡化旋转算法实现

    在实际的AVL树实现中,通常会有主菜单供用户选择执行的操作,如插入新节点、删除指定节点、显示树的结构等。程序会根据用户的选择进行相应的操作,并在操作后检查是否需要进行平衡旋转,以保持AVL树的特性。 在提供...

    华科数据结构AVL树课设

    在这个【课程设计】中,学生被要求基于AVL树实现一个【Set集合】。Set集合是一种不包含重复元素的数据结构,支持插入、删除和查询等基本操作。在AVL树上实现Set集合,可以利用AVL树的特性来快速完成这些操作,比如...

    AVL树模拟用户登录系统的实验报告(附代码和详尽注释)

    实验报告的标题是“AVL树模拟用户登录系统...总结,这个实验报告深入探讨了如何使用AVL树实现一个高效、平衡的用户登录系统,强调了数据结构在实际应用中的重要性,同时也展示了在软件工程实践中解决问题的思路和方法。

    AVL树(纯C代码)

    在提供的C代码中,`avlTree.c`和`avlTree.h`文件构成了一个简单的AVL树实现。`avlTree.h`文件通常包含了AVL树结构的定义和相关的函数声明,而`avlTree.c`则实现了这些函数的详细逻辑。 1. **AVL树的节点结构**: ...

    红黑树和AVL树的实现

    AVL树的平衡性比红黑树更强,因此在查找效率上通常优于红黑树,但插入和删除操作可能需要更多的旋转,导致更复杂的实现。红黑树的平衡要求相对较宽松,插入和删除操作的代价较低,且在实践中表现良好,是许多语言...

    AVL树的C语言实现

    在C语言中实现AVL树,首先需要定义AVL树的节点结构。每个节点包含三个部分:存储数据的关键字(key)、节点的高度(height)以及指向左子树和右子树的指针。一个简单的节点定义如下: ```c typedef struct AVLNode ...

    用Qt制作的登录系统,使用Avl树实现增删改查,UI界面仅有登录系统.zip

    《基于Qt的登录系统设计与实现——以Avl树为核心的数据管理》 本文将深入探讨一个使用Qt框架构建的登录系统,该系统采用Avl树作为数据结构进行增删改查操作,是计算机专业学生理想的毕业设计案例。Qt是一个跨平台的...

Global site tag (gtag.js) - Google Analytics