UVa-122 树的遍历
2015-12-10 19:46
253 查看
分析:这个题按道理来说是用建立一棵树,之后用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;
}
,(多方求助终于发现)这个题只需对每个节点的位置排一下序就好了
本题多谢多个大神的意见和大神的代码,我才成功做出这个题
代码如下:
#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;
}
相关文章推荐
- ios软件开发在中国的前景
- Charm Bracelet-POJ3624(01背包)
- Android中Service生命周期
- 修复win7和wubi装的ubuntu双系统引导
- PCA降维算法总结以及matlab实现PCA(个人的一点理解)
- Swift中的断言assert
- 小猪的数据结构辅助教程——2.4 线性表中的循环链表
- UVA10815 Andy's First Dictionary(STL)
- osc的git服务器简单使用。
- poj 1035 串
- Android-4-X界面开发那点事
- Linux用户空间与内核空间数据传递的几点理解和总结
- FLV科普4 FLV头信息解析
- select语句详解
- 结合框架的方法
- BZOJ2763, 最短路
- UVA—10817 Headmaster's Headache
- shopxx研究
- nginx location
- 使用9Patch图片作为背景