zoukankan      html  css  js  c++  java
  • 纯C语言实现的AVL树(插入&删除&前序遍历输出)

    突发奇想的敲了一遍,主要是想加深一下理解,毕竟AVL还是很重要的。
    敲完了就想着发上来方便以后考前看看……..
    顺便推荐一下这位大神的文章http://www.cnblogs.com/skywang12345/p/3576969.html

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX(a,b) ((a)>(b)?(a):(b)) //比较大小 
    #define Height(p) ((p==NULL)?0:(((Tree)(p))->height)) // 求高度 
    
    typedef struct Node* Tree;
    
    struct Node
    {
        int Key;
        int height;
        Tree Left;
        Tree Right;
    };
    
    Tree nodeCreate(int Key) //创建节点 
    {
        Tree p = (Tree)malloc(sizeof(struct Node));
        if(p == NULL)return p;
        p->height = 0;
        p->Key = Key;
        p->Left = NULL;
        p->Right = NULL;
        return p;
    }
    
    Tree lL(Tree k2) 
    {
        Tree 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;
    }
    
    Tree rR(Tree k1)
    {
        Tree k2 = k1->Right;
        k1->Right = k2->Left;
        k2->Left = k1;
        k1->height = MAX(Height(k1->Left) , Height(k1->Right))+1;
        k2->height = MAX(Height(k2->Left) , Height(k2->Right))+1;
    
        return k2;
    }
    
    Tree lR(Tree k3)
    {
        k3->Left = rR(k3->Left);
        return lL(k3);
    }
    
    Tree rL(Tree k3)
    {
        k3->Right = lL(k3->Right);
        return rR(k3);
    }
    
    Tree nodeInsert(Tree root,int data) //插入 
    {
        if(root == NULL)
        {
            root = nodeCreate(data);
            if(root == NULL)
            {
                printf("ERROR of the memory!!!
    ");
                return NULL;
            }
        }
        else if(root->Key == data)
        {
            printf("ERROR of the data!!!
    ");
        }
        else if(root->Key > data)
        {
            root->Left = nodeInsert(root->Left,data);
            if(Height(root->Left) - Height(root->Right) == 2)
            {
                if(data < root->Left->Key)
                {
                    root = lL(root);
                }
                else if(data >= root->Left->Key)
                {
                    root = lR(root);
                }
            }
        }
        else if(root->Key < data)
        {
            root->Right = nodeInsert(root->Right,data);
            if(Height(root->Right) - Height(root->Left) == 2)
            {
                if(data > root->Right->Key)
                {
                    root = rR(root);
                }
                else if(data <= root->Right->Key)
                {
                    root = rL(root);
                }
            }
        }
    
        root->height = MAX( Height(root->Left) , Height(root->Right) )+1;
    
        return root;
    }
    
    Tree nodeDelete(Tree root,int data) //删除 
    {
        if(root == NULL)
        {
            printf("Don`t have this data!!!
    ");
            return NULL;
        }
    
        if(data < root->Key)
        {
            root->Left = nodeDelete(root->Left,data);
            if(Height(root->Right) - Height(root->Left) == 2)
            {
                if(Height(root->Right->Left) > Height(root->Right->Right))
                {
                    root = rL(root);
                }
                else root = rR(root);
            }
        }
        else if(data > root->Key)
        {
            root->Right = nodeDelete(root->Right,data);
            if(Height(root->Left) - Height(root->Right) == 2)
            {
                if(Height(root->Left->Left) > Height(root->Left->Right))
                {
                    root = lL(root);
                }
                else root = lR(root);
            }
        }
        else if(data == root->Key) 
        {
            if(root->Left && root->Right)
            {
                if(Height(root->Left) > Height(root->Right))
                {
                    Tree max = root->Left;
                    Tree tr = root;
                    int flag = 1;
                    while(max->Right)
                    {
                        if(flag)
                        {
                            flag = 0;
                            tr = tr->Left;
                        }
                        else tr = tr->Right;
                        max = max->Right;
                    }
                    root->Key = max->Key;
                    if(flag)tr->Left = NULL;
                    else tr->Right = NULL;
                    free(max);
                }
                else
                {
                    Tree max = root->Right;
                    Tree tr = root;
                    int flag = 1;
                    while(max->Left)
                    {
                        if(flag)
                        {
                            flag = 0;
                            tr = tr->Right;
                        }
                        else tr = tr->Left;
                        max = max->Left;
                    }
                    root->Key = max->Key;
                    if(flag)tr->Right = NULL;
                    else tr->Left = NULL;
                    free(max);
                }
            }
            else
            {
                Tree t = root;
                root = (root->Left ? root->Left : root->Right);
                free(t);
            }
        }
    
        return root;
    }
    
    void preorderPrintf(Tree tree) // 前序遍历 
    {
        if(tree != NULL)
        {
            printf("%d ", tree->Key);
            preorderPrintf(tree->Left);
            preorderPrintf(tree->Right);
        }
    }
    
    int main()
    {
        Tree root = NULL;
    
        int N;
        scanf("%d",&N);
        while(N--)
        {
            int mid;
            scanf("%d",&mid);
            root = nodeInsert(root,mid);
        }
    
        int M;
        scanf("%d",&M);
        while(M--)
        {
            int mid;
            scanf("%d",&mid);
            root = nodeDelete(root,mid);
        }
    
        preorderPrintf(root);
    
        return 0;
    }
  • 相关阅读:
    设备上下文相关函数 冷夜
    DirectxDraw加载位图 冷夜
    MMO游戏数值框架概述(偏模拟方向) 冷夜
    C++基本数据类型列表 冷夜
    Ryzom相关的项目简介 冷夜
    使用QueryPerformanceFrequency 计算程序执行时间 冷夜
    C和C++运算符 冷夜
    编译错误记录文档 冷夜
    ANSI编码对比表 冷夜
    mscorsvw.exe是什么 冷夜
  • 原文地址:https://www.cnblogs.com/vocaloid01/p/9514209.html
Copyright © 2011-2022 走看看