UVa-122 树的遍历

分析:这个题按道理来说是用建立一棵树,之后用BFS搜索来做,然而,我树论和BFS都一窍不通,只能走点歪门邪道
,(多方求助终于发现)这个题只需对每个节点的位置排一下序就好了

本题多谢多个大神的意见和大神的代码,我才成功做出这个题



代码如下:


#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#include <string>
#include <set>
#include <algorithm>
struct Node
{
    string v;
    string path;
};
struct Node nodes[280];
set <string> p_set;

int get_(string s)  //把,分割的两个字符串分开
{
    int i=0;
    for (i=0;i<s.length();i++)
        if (s[i]==',')
            return i;
    return -1;
}
bool cmp(const Node& a, const Node& b)//排序按长度从小到大,同长度按字符串从小到大
{
    if (a.path.length()!=b.path.length())
        return a.path.length()<b.path.length();
    return a.path<b.path;
}
int main()
{
    int flag;
    int i,j,k;
    string str;
    i=0;
    flag=1;
    p_set.clear();
    while (cin>>str)
    {
        if (str!="()")
        {
            j=get_(str);
            if (j!=-1)
            {
                nodes[i].v=str.substr(1,j-1);
                nodes[i].path=str.substr(j+1, str.length()-j-2);
                if (nodes[i].v.length()==0)//判断是否赋予value值
                    flag=0;
                if (p_set.find(nodes[i].path)!=p_set.end())
                    flag=0;//判断是否已经出现过
                else
                    p_set.insert(nodes[i].path);
                i++;
            }
        }
        else
        {
            if (flag==0)
                printf("not complete\n");
            else
            {
                sort(nodes,nodes+i,cmp);
                p_set.clear();
                if (nodes[0].path.length()==0)//根节点
                {
                    p_set.insert(nodes[0].path);
                    for (j=1;j<i;j++)
                    {
                        if (p_set.find(nodes[j].path.substr(0,nodes[j].path.length()-1))==p_set.end())
                            flag=0;//这一句核心,判断他是否有上级节点
                        else
                            p_set.insert(nodes[j].path);
                    }
                    if (flag==0)
                        printf("not complete\n");
                    else {
                        for (j=0;j<i-1;j++)
                            cout << nodes[j].v << " ";
                        cout << nodes[j].v << endl;
                    }
                }
                else
                    printf("not complete\n");
            }
            i=0;
            p_set.clear();
            flag=1;
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值