POJ3481: 排序二叉树

先把代码附上。

maxwhut20173481Accepted184K
297MS

//POJ3481

#include <iostream>#include <cstdio>using namespace std;

struct pnt{
    int v;
    int r;
    pnt* ch[2];
};
pnt *top=NULL;
bool empty=1;
void insert(int v, int r, pnt &p, bool ok){
    if(ok||empty==1){
        p.v=v;
        p.r=r;
        p.ch[0]=p.ch[1]=NULL;
    }
    else if(r>p.r){
        if(p.ch[1]==NULL){
            p.ch[1]=new pnt();
            insert(v,r,*p.ch[1],1);
        }
        else insert(v,r,*p.ch[1],0);
    }
    else if(r<p.r){
        if(p.ch[0]==NULL){
            p.ch[0]=new pnt();
            insert(v,r,*p.ch[0],1);
        }
        else insert(v,r,*p.ch[0],0);
    }
    empty=0;
}
bool find(int dir, pnt* p, int cur){
    if(empty==1){printf("0\n");return 1;}
    else if((*p).ch[dir]==NULL){
        printf("%d\n",(*p).v);
        if(cur==1){
            if((*p).ch[dir^1]==NULL){
                empty=1;
                top=NULL;
            }
            else top=(*p).ch[dir^1];
            delete p;
        }
        return 1;
    }
    else {
        bool ok=find(dir,(*p).ch[dir],cur+1);
        if(ok){
            pnt *del=(*p).ch[dir];
            (*p).ch[dir]=(*(*p).ch[dir]).ch[dir^1];
            delete del;
        }
        return 0;
    }
}
int main()
{
    int order;while(scanf("%d",&order)&&order){
        if(order==1){
            int v,r;scanf("%d%d",&v,&r);
            if(top==NULL)top=new pnt();
            insert(v,r,*top,0);
        }
        else if(order==2){
            if(top==NULL)top=new pnt();
            find(1,top,1);
        }
        else if(order==3){
            if(top==NULL)top=new pnt();
            find(0,top,1);
        }
    }
    return 0;

}

很水的一个题目,堪称POJ大水题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值