zoj1167

题目大意:

如下图例子这里写图片描述
可以描述为:(11,LL) (7,LLL) (8,R)(5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
写一段程序层次输出这棵树,如果树不完整,输出”not complete”

解题思路:

代码如下:

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
typedef struct
{
       string num;
       string str;
}node;
node tree[300];
string temp;
bool cmp(node x,node y)
{
       if(x.str.length()==y.str.length())
              return x.str<y.str;
       else return x.str.length()<y.str.length();
}
int main()
{
       int i,j,flag,ff,len;
       while(cin>>temp)
       {
              //string À಻¿ÉÒÔmemsetÇå0µÄ£¬²»È»ÒªREµÄ
              for(i=0;i<300;i++)
              {
                     tree[i].num="";
                     tree[i].str="";
              }
              i=1;
              while(temp[i]!=',')
              { tree[0].num+=temp[i]; i++;}
              i++;
              if(temp[i]==')') tree[0].str="A";
              else
              {
                     while(temp[i]!=')')
                     { tree[0].str+=temp[i]; i++;}
              }
              j=1;
              while(cin>>temp)
              {
                     if(temp=="()") break;
                     i=1;
                     while(temp[i]!=',')
                     { tree[j].num+=temp[i]; i++;}
                     i++;
                     if(temp[i]==')') tree[j].str="A";
                     else
                     {
                            while(temp[i]!=')')
                            { tree[j].str+=temp[i]; i++;}
                     }
                     j++;
              }
              len=j;
              sort(tree,tree+len,cmp);
              flag=0;
              if(tree[0].str!="A") flag=1;
              for(i=0;i<len;i++)
              {
                     if(flag) break;
                     if(i!=j-1 && tree[i].str==tree[i+1].str) {flag=1; break;}
                     if(tree[i].str.length()>=2)
                     {
                            temp = tree[i].str.substr (0,tree[i].str.length()-1);
                            //cout<<"temp= "<<temp<<endl;
                            ff=0;
                            for(j=0;j<i;j++)
                            {
                                   if(temp==tree[j].str)
                                   {
                                          ff=1;
                                          break;
                                   }
                            }
                            if(ff==0) flag=1;
                     }
                     //cout<<tree[i].num<<" "<<tree[i].str<<endl;      
              }
              if(flag) cout<<"not complete"<<endl;
              else
              {
                     for(i=0;i<len-1;i++)
                            cout<<tree[i].num<<" ";
                     cout<<tree[i].num<<endl;
              }
       }
       return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值