数据结构作业——魔法少女(平衡二叉树)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构作业——魔法少女(平衡二叉树)相关的知识,希望对你有一定的参考价值。

魔法少女之相亲大会

Description

由于之前的相亲大会的组织者太过糟糕,实验室的大家仍然没有摆脱 single dog 的命运!!所以请了魔法少女小风,来帮忙实验室脱单!于是光棍节这天,美少女小风重新组织一波相亲大会。她先让男生们按着帅气值高低,从左到右站成一排,接下来 n 秒,每一秒释放一次巴啦啦小风能量!小风能量随机出现"JX"时:粗线了一名男生,然后这个男生会根据自己的帅气值,走到队列里相应的位置。
小风能量随机出现"XQ"时:粗线了一名女生,女生会说一个心仪的对象的帅气值,然后那名男生就走出队伍,和女生走啦~
小风能量随机出现"WT"时:粗线了一名女生,女生会说一个心仪的对象的位置,可是,这个男生缩他不喜欢女生。所以拒绝了这个女生。此刻输出该名男生的帅气值。
小风能量随机出现"YOU"时:魔法失败,输出“ Single dog!”
当魔法结果为“ XQ”时,保证帅气值一定存在。
数据范围在 int 范围之内。保证队伍中不会存在重复的帅气值。
男生的位置编号从 1 开始。

Input

第一行输入一个整数 n( 0<n<=111111) ,接下来 n 行,每行输入魔法结果 c。

Output

当魔法结果为“ WT”时,输出女生说的位置的帅气值。找不到时输出 0
当魔法结果为“ YOU”时,输出“Single dog!"。

Sample Input

10
JX 11
JX 111
JX 1111
WT 1
XQ 11
WT 1
XQ 111
WT 1
WT 1111
YOU

Sample Output

11
111
1111
0
Single dog!

思路

平衡二叉树模板题

 

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 111119;
typedef struct sbtnod
{
    int key,left,right,size;
} sbtnode;
int sbttail = 0,root = 0;

sbtnode tree[maxn];

void rrotate(int& t)
{
    int k = tree[t].left;
    if (!k) return ;
    tree[t].left = tree[k].right;
    tree[k].right = t;
    tree[k].size = tree[t].size;
    tree[t].size = tree[tree[t].left].size + tree[tree[t].right].size + 1;
    t = k;
}

void lrotate(int& t)
{
    int k = tree[t].right;
    if (!k) return ;
    tree[t].right  =tree[k].left;
    tree[k].left = t;
    tree[k].size = tree[t].size;
    tree[t].size = tree[tree[t].left].size + tree[tree[t].right].size + 1;
    t = k;
}

void maintain(int& t,bool flag)
{
    if (!t) return ;
    if (!flag)
        if (tree[tree[tree[t].left].left].size > tree[tree[t].right].size) rrotate(t);
        else if (tree[tree[tree[t].left].right].size > tree[tree[t].right].size) 
        {
            lrotate(tree[t].left);
            rrotate(t);
        } else return ;
    else
        if (tree[tree[tree[t].right].right].size > tree[tree[t].left].size) lrotate(t);
        else if (tree[tree[tree[t].right].left].size > tree[tree[t].left].size)
        {
            rrotate(tree[t].right);
            lrotate(t);
        } else return ;
    
    maintain(tree[t].left,false);
    maintain(tree[t].right,true);
    maintain(t,false);
    maintain(t,true);
}

void insert(int& t,int v)
{
    if (!t)
    {
        sbttail++;
        tree[sbttail].key = v;
        tree[sbttail].size = 1;
        t = sbttail;
    } else 
    {
        tree[t].size++;
        if (v < tree[t].key) insert(tree[t].left,v);
        else insert(tree[t].right,v);
        maintain(t,v >= tree[t].key);
    }
}

int del(int& t,int v)
{
    int ret;
    tree[t].size--;
    if (v == tree[t].key||(v < tree[t].key && tree[t].left == 0)||(v > tree[t].key && tree[t].right == 0))
    {
        ret=tree[t].key;
        if (tree[t].left == 0||tree[t].right == 0) t = tree[t].left + tree[t].right;
        else tree[t].key = del(tree[t].left,tree[t].key + 1);
    } else 
    {
        if (v < tree[t].key) ret = del(tree[t].left,v);
        else ret = del(tree[t].right,v);
    }
    return ret;
}

int select(int &x,int k)      
{      
    int r = tree[tree[x].left].size + 1;      
    if (k < r) return select(tree[x].left,k);      
    else      
    if (k > r) return select(tree[x].right,k - r);      
    else      
    return tree[x].key;      
}   

int main()      
{      
    int n,val;      
    char opt[10];       
    scanf("%d",&n);      
    while (n--)      
    {      
        scanf("%s",opt);      
        if (strcmp(opt,"JX") == 0)      
        {      
            scanf("%d",&val);      
            insert(root,val);      
        }      
        else if (strcmp(opt,"XQ") == 0)      
        {      
            scanf("%d",&val);      
            del(root,val);      
        }      
        else if (strcmp(opt,"WT") == 0)      
        {      
            scanf("%d",&val);      
            printf("%d\n",select(root,val));       
        }      
        else if (strcmp(opt,"YOU") == 0)      
        {      
            printf("Single dog!\n");      
        }      
    }       
    return 0;      
}

 

  

 

以上是关于数据结构作业——魔法少女(平衡二叉树)的主要内容,如果未能解决你的问题,请参考以下文章

[数据结构4.8]平衡二叉树

求数据结构算法平衡二叉树实现代码

数据结构与算法二叉树——平衡二叉树

平衡二叉树的删除

数据结构手写平衡二叉树(AVL)

平衡二叉树代码