码迷,mamicode.com
首页 > 其他好文 > 详细

左儿子右兄弟表示法

时间:2014-07-19 15:36:52      阅读:1298      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   文件   

 

顾名思义 

每个节点一个为儿子指针,一个为兄弟指针(在加个父亲)

这样就避免了儿子个数不均带来的问题

 

TOJ   TOJ4077

用一个指针记录当前在哪个节点,需要注意的是可以有多个重名的文件,但是不能在一个目录下。

所以用文件名和其父亲节点作为一个文件的id(区分其他)。

bubuko.com,布布扣
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
#include <map>

using namespace std;

typedef long long LL;

const int N=100100;
char ma[N][20];
int mma[N];
char ans[N][20];
struct node {
    int son,fa;
    int bro;
}root,a[N];
int cnt;
int cur;
void add(int x,char *s){
    strcpy(ma[cnt],s);
    mma[cnt]=x;
    int p=a[x].son;
    a[cnt].bro=-1;
    a[cnt].fa=x;
    a[cnt].son=-1;
    if(p==-1){
        a[x].son=cnt;
    }
    else{
        while(a[p].bro!=-1)p=a[p].bro;
        a[p].bro=cnt;
    }
    cnt++;
}
void dele(int x,int y){
    int p=a[x].son;
    if(p==-1)return;
    if(p==y){
        a[x].son=a[p].bro;
    }
    else{
        while(p!=-1&&a[p].bro!=y)p=a[p].bro;
        if(p==-1)return;
        a[p].bro=a[a[p].bro].bro;
        return;
    }
}
void init(){
    a[0].fa=-1;
    a[0].son=-1;
    a[0].bro=-1;

    cnt=1;
    add(0,"home");
    add(1,"brotherkai");
    cur=2;
}
int fin(int x,char str[]){
    for(int i=0;i<cnt;i++){
        if(strcmp(ma[i],str)==0&&mma[i]==x){
            return i;
        }
    }
    return -1;
}
int r[N];
int cmp(int a,int b){
    if(strcmp(ans[a],ans[b])<=0)return 1;
    return 0;
}
void dfs(int x){
    mma[x]=-1;
    for(int i=a[x].son;i!=-1;i=a[i].bro){
        dfs(i);
    }
    return;
}
void solve(char str[]){
    char op1[50],op2[50];
    if(str[0]==l){
        int nu=0;
        for(int i=a[cur].son;i!=-1;i=a[i].bro){
            strcpy(ans[nu++],ma[i]);
        }
        for(int i=0;i<nu;i++)r[i]=i;
        if(nu){
            sort(r,r+nu,cmp);
            printf("%s",ans[r[0]]);
            for(int i=1;i<nu;i++){
                printf(" %s",ans[r[i]]);
            }

        }
        printf("\n");
    }
    else if(str[0]==c){
        scanf("%s",op1);
        if(op1[0]==/){
            cur=0;
        }else if(op1[0]==.){
            if(cur!=0)
                cur=a[cur].fa;
        }
        else{
            int x=fin(cur,op1);
            if(x==-1)return;
            cur=x;
        }
    }
    else if(str[0]==r){
        scanf("%s%s",op2,op1);
        int x=fin(cur,op1);
        if(x==-1)return;
        else{
            mma[x]=-1;
            dfs(x);
            dele(cur,x);
        }
    }
    else if(str[0]==m){
        scanf("%s",op1);
        int x=fin(cur,op1);
        if(x==-1){
            add(cur,op1);
        }
    }
    return;

}

int main()
{

    char str[30];
    init();
    while(scanf("%s",str),str[0]!=e){

        solve(str);

    }
    return 0;
}
View Code

左儿子右兄弟表示法,布布扣,bubuko.com

左儿子右兄弟表示法

标签:style   blog   http   color   os   文件   

原文地址:http://www.cnblogs.com/youyouyou/p/3853945.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!