IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> AvlTree 数据结构与算法分析C语言实现 -> 正文阅读

[数据结构与算法]AvlTree 数据结构与算法分析C语言实现

AvlTree

Avl的节点以及相关函数声明

#ifndef _AvlTree_H

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

// AvlTree MakeEmpty(AvlTree T);
Position Find(int X, AvlTree T);
Position FindMin(AvlTree T);
Position FindMax(AvlTree T);
AvlTree Insert(int X, AvlTree T);
AvlTree Delete(int X, AvlTree T);
// int Retrieve(Position P);
AvlTree SingleRotateWithLeft(Position K);
AvlTree DoubleRotateWithLeft(Position K);
AvlTree SingleRotateWithRight(Position K);
AvlTree DoubleRotateWithRight(Position K);
int Max(int X, int Y);
static int Height(Position P);

#endif

struct AvlNode
{
    int Element;
    AvlTree Left;
    AvlTree Right;
    int Height;
};

Height()

static int Height(Position P)
{
    if (P == NULL)
        return -1;
    else
        return P->Height;
}

Find()

Position Find(int X, AvlTree T)
{
    if (T == NULL)
        return NULL;
    else if (X < T->Element)
        return Find(X, T->Left);
    else if (X > T->Element)
        return Find(X, T->Right);
    else
        return T;
}

FindMin()

Position FindMin(AvlTree T)
{
    if (T == NULL)
        return NULL;
    else if(T->Left == NULL)
        return T;
    else
        return FindMin(T->Left);
}

Insert()

AvlTree Insert(int X, AvlTree T)
{
    if (T == NULL)
    {
        T = (AvlTree)malloc(sizeof(struct AvlNode));
        if (T == NULL)
        {
            printf("Out of space");
            exit(EXIT_FAILURE);
        }
        T->Element = X;
        T->Height = 0;
        T->Left = T->Right = NULL;
    }
    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;
}

Delete()

AvlTree Delete(int X, AvlTree T)
{
    if (T == NULL)
    {
        fprintf(stderr, "%d not exist\n", X);
    }
    else
    {
        if (X < T->Element)
        {
            T->Left = Delete(X, T->Left);
            T->Height = Max(Height(T->Left), Height(T->Right)) + 1;
            if (Height(T->Right) - Height(T->Left) == 2)
                if (Height(T->Right->Right) >= Height(T->Right->Left))
                    T = SingleRotateWithRight(T);
                else
                    T = DoubleRotateWithRight(T);
        }
        else if (X > T->Element)
        {
            T->Right = Delete(X, T->Right);
			T->Height = Max(Height(T->Left), Height(T->Right)) + 1;
			if((Height(T->Left) - Height(T->Right)) == 2)
			{
				if(Height(T->Left->Left) >= Height(T->Left->Right))
					T = SingleRotateWithLeft(T);
				else
					T = DoubleRotateWithLeft(T);
			}
        }
        else
        {
            if(T ->Left && T->Right)
			{
				T->Element = FindMin(T->Right)->Element;
				T->Right = Delete(T->Element, T->Right);
                 T->Height = Max(Height(T->Left), Height(T->Right)) + 1;

				if((Height(T->Left) - Height(T->Right)) == 2)
				{
					if(Height(T->Left->Left) >= Height(T->Left->Right))
						T = SingleRotateWithLeft(T);
					else
						T = DoubleRotateWithLeft(T);
				}
			}
			else
			{
			    AvlTree Tmp = T;
				if(T->Left == NULL)
					T= T->Right;
				else
					T= T->Left;
				free(Tmp);
			}
        }
    }
    return T;
}

SingleRotateWithLeft()

AvlTree SingleRotateWithLeft(Position K2)
{
    Position 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), K2->Height) + 1;
    return K1;
}

DoubleRotateWithLeft()

AvlTree DoubleRotateWithLeft(Position K3)
{
    /* Rotate between K1 and K2 */
    K3->Left = SingleRotateWithRight(K3->Left);
    /* Rotate between K3 and K2 */
    return SingleRotateWithLeft(K3);
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-24 15:08:14  更:2021-10-24 15:10:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:54:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码