zoukankan      html  css  js  c++  java
  • 树的各种操作代码实现

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAXNODE 100
    
    struct TreeNode
    {
        int element,height;
        struct TreeNode *left;
        struct TreeNode *right;
    };
    
    int node[MAXNODE+1];
    typedef struct TreeNode Tree;
    
    int MAX(int m,int n)
    {
        //判断两个数大小的函数
        return m>=n?m:n;
    }
    
    int Height(Tree *position)
    {
        //返回节点的高度的函数
        if(position==NULL)
            return -1;
        else
            return position->height;
    }
    
    Tree *Find(Tree *T,int n)
    {
        //查找节点并返回其在树中位置的函数
        if(T!=NULL)
        {
            if(n==T->element)
                return T;
            else if(n<T->element)
                return Find(T->left,n);
            else
                return Find(T->right,n);
        }
        return NULL;
    }
    
    Tree *SingleRotateWithLeft(Tree *k2)          //名字叫Left是因为累赘在左边
    {
        //实现右单旋转的函数
        Tree *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(k2->right))+1;
        return k1;//返回旋转后的父节点
    }
    
    Tree *SingleRotateWithRight(Tree *k1)
    {
        //实现左单旋转的函数
        Tree *k2;
        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 *DoubleRotateWithLeft(Tree *k)     //名字叫Left是因为累赘在左边
    {
        //实现左右双旋转的函数
        k->left=SingleRotateWithRight(k->left);
        return SingleRotateWithLeft(k);
    
    }
    
    Tree *DoubleRotateWithRight(Tree *k)
    {
        //实现双右左旋转的函数
        k->right=SingleRotateWithLeft(k->right);
        return SingleRotateWithRight(k);
    }
    
    Tree *InsertSearchTree(Tree *T,int n)
    {
        //将节点插入二叉查找树的函数
        if(T==NULL)
        {
            T= malloc(sizeof(Tree));
        if(T==NULL)
            exit(0);
        T->element=n;
        T->height=0;
        T->left=T->right=NULL;
        }
        else if(n<T->element)
            T->left=InsertSearchTree(T->left,n);
        else if(T->element<n)
            T->right=InsertSearchTree(T->right,n);
        T->height=MAX(Height(T->left),Height(T->right))+1;
        return T;
    }
    
    Tree *InsertAvlTree(Tree *T,int n)
    {
        //将节点插入avl树的函数
        if(T==NULL)
        {
            T= malloc(sizeof(Tree));
        if(T==NULL)
            exit(0);
        T->element=n;
        T->height=0;
        T->left=T->right=NULL;
        }
        else if(n<T->element)
        {
            T->left=InsertAvlTree(T->left,n);
            if(Height(T->left)-Height(T->right)>1)
            {
                if(n<T->left->element)
                    T=SingleRotateWithLeft(T);
                else
                    T=DoubleRotateWithLeft(T);
            }
        }
        else if(n>T->element)
        {
            T->right=InsertAvlTree(T->right,n);
            if(Height(T->right)-Height(T->left)>1)
            {
                if(n<T->right->element)
                    T=DoubleRotateWithRight(T);
                else
                    T=SingleRotateWithRight(T);
            }
        }
        T->height=MAX(Height(T->left),Height(T->right))+1;
        return T;
    }
    
    Tree *Revise(Tree *T)
    {
        //将一颗二叉查找树变成avl的函数
        if(T==NULL)
            return NULL;
        T->left=Revise(T->left);
        T->right=Revise(T->right);
        T->height=MAX(Height(T->left),Height(T->right))+1;
        if(Height(T->left)-Height(T->right)>1)
        {
            if(Height(T->left->left)>=Height(T->left->right))
                T=SingleRotateWithLeft(T);
            else
                T=DoubleRotateWithLeft(T);
        }
        else if(Height(T->right)-Height(T->left)>1)
        {
            if(Height(T->right->right)>=Height(T->right->left))
                T=SingleRotateWithRight(T);
            else
                T=DoubleRotateWithRight(T);
        }
        return T;
    }
    
    int IsAvlTree(Tree *T)
    {
        //判断二叉查找树是不是avl树的函数
        if(T!=NULL)
        {
            if(Height(T->left)-Height(T->right)>1||Height(T->right)-Height(T->left)>1)
                return -1;
            if(IsAvlTree(T->left)==-1||IsAvlTree(T->right)==-1)
                return -1;
        }
        return 0;
    }
    
    void Travel(Tree *T)
    {
        //遍历avl树并按照先序遍历输出各节点的函数
        if(T!=NULL)
            printf("%d",T->element);
        Travel(T->left);
        Travel(T->right);
    }
    
    Tree *Delete(Tree *T,int n)
    {
        //将树中指定节点删除的函数
        Tree *tmp;
        if(T==NULL)
            return NULL;
        if(T->element==n)
        {
            if(T->right==NULL)
            {
                tmp=T;
                T=T->left;
                free(tmp);
            }
            else                                                                    //如果右子树存在
            {
                tmp=T->right;
                while(tmp->left!=NULL)
                    tmp=tmp->left;                                                 //找到右子树的值最小的节点
                T->element=tmp->element;                                            //用该节点的值代替原来的节点的值
                T->right=Delete(T->right,tmp->element);                             //递归的删除右子树中用来替代源节点的值的节点
                T->height = MAX(Height(T->left),Height(T->right)) + 1;
            }
            return T;
        }
        if(n < T->element)
            T->left = Delete(T->left,n);
        else
            T->right = Delete(T->right,n);
        T->height = MAX(Height(T->left),Height(T->right)) + 1;
        return T;
    }
    
    Tree *MakeEmpty(Tree *T)
    {
        //将树中各节点清空的函数
        if(T!=NULL)
        {
            MakeEmpty(T->left);
            MakeEmpty(T->right);
            free(T);
        }
        return NULL
    }

    //后面四幅图分别对应代码中四种旋转函数

  • 相关阅读:
    PHP学习笔记(二)
    PHP开发笔记(一)
    PHP NOTE
    python windows进制文件可以直接下载使用
    深入浅出Hyper-V网络虚拟化技术
    深入浅出Hyper-V网络虚拟化(序)
    Windows Server 笔记(七):Windows Server 2012 R2 NIC Teaming(NIC组)
    Hyper-v Server 2012 R2增强会话模式
    Hyper-V动态迁移中?小心性能损失
    CLOUDSTACK FOR HYPER-V
  • 原文地址:https://www.cnblogs.com/CClarence/p/5158982.html
Copyright © 2011-2022 走看看