AVL树模版

来源:互联网 发布:array 添加数据 编辑:程序博客网 时间:2024/06/05 06:10
#include<stdio.h>#include<string.h>#include<iostream>using namespace std;struct AVL_tree_node{    char name[31];    int cnt,height;    AVL_tree_node *pleft;    AVL_tree_node *pright;};int n=0;int Height(AVL_tree_node *p){    if(p==NULL) return -1;    return p->height;}AVL_tree_node* LLRotate(AVL_tree_node *Root){    AVL_tree_node *p=Root->pleft;    Root->pleft=p->pright;    p->pright=Root;    Root->height=max(Height(Root->pleft),Height(Root->pright))+1;    p->height=max(Height(p->pleft),Root->height)+1;    return p;}AVL_tree_node* RRRotate(AVL_tree_node *Root){    AVL_tree_node *p=Root->pright;    Root->pright=p->pleft;    p->pleft=Root;    Root->height=max(Height(Root->pleft),Height(Root->pright))+1;    p->height=max(Height(p->pright),Root->height)+1;    return p;}AVL_tree_node* LRRotate(AVL_tree_node *Root){    Root->pleft=RRRotate(Root->pleft);    return LLRotate(Root);}AVL_tree_node* RLRotate(AVL_tree_node *Root){    Root->pright=LLRotate(Root->pright);    return RRRotate(Root);}AVL_tree_node* Insert(char s[],AVL_tree_node *Root){    if(Root==NULL)    {        Root=new AVL_tree_node;        strcpy(Root->name,s);        Root->cnt=1;        Root->height=0;        Root->pleft=Root->pright=NULL;        return Root;    }    int t=strcmp(s,Root->name);    if(t==0)    {        Root->cnt++;    }    else if(t<0)    {        Root->pleft=Insert(s,Root->pleft);        if(Height(Root->pleft)-Height(Root->pright)==2)        {            if(strcmp(s,Root->pleft->name)<0) Root=LLRotate(Root);            else Root=LRRotate(Root);        }    }    else    {        Root->pright=Insert(s,Root->pright);        if(Height(Root->pright)-Height(Root->pleft)==2)        {            if(strcmp(s,Root->pright->name)>0) Root=RRRotate(Root);            else Root=RLRotate(Root);        }    }    Root->height=max(Height(Root->pleft),Height(Root->pright))+1;    return Root;}void mid_cal(AVL_tree_node *Root){    if(Root!=NULL)    {        mid_cal(Root->pleft);        printf("%s %.4lf\n",Root->name,Root->cnt*100.0/n);        mid_cal(Root->pright);    }}int main(){    AVL_tree_node *Root=NULL;    char s[31];    while(gets(s)!=NULL)    {        Root=Insert(s,Root);        n++;    }    mid_cal(Root);}


0 0
原创粉丝点击