首页 > 代码库 > 左儿子右兄弟表示法
左儿子右兄弟表示法
顾名思义
每个节点一个为儿子指针,一个为兄弟指针(在加个父亲)
这样就避免了儿子个数不均带来的问题
TOJ TOJ4077
用一个指针记录当前在哪个节点,需要注意的是可以有多个重名的文件,但是不能在一个目录下。
所以用文件名和其父亲节点作为一个文件的id(区分其他)。
#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;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。