【华为编码大赛】树遍历
来源:互联网 发布:mac eclipse配置maven 编辑:程序博客网 时间:2024/05/19 10:54
思路:用结构体记录下每个节点的父节点。从叶子节点依次往上遍历,直到与后面的节点最近的父节点停止,再从该节点向下遍历至后面的叶子节点,将结果存进ans数组,并统计每个数出现的次数,大于2时结束操作,输出-1,否则输出ans数组。
#include <cstdio>#include <cstring>const int LEN=330;struct Node{ int fa; int n; int ncount;}node[LEN];int k;int last[LEN]; //依次保存叶子节点int order[LEN][LEN]; //每个叶子节点向上遍历至根节点的路径,用哈希的方式储存int cou[LEN]; //用于统计每个节点被遍历的次数int ans[LEN*LEN];int res;int f;void ini() //初始化函数{ memset(node,0,sizeof(node)); memset(order,0,sizeof(order)); memset(cou,0,sizeof(cou)); res=0; f=1; for(int i=1;i<=k;i++) node[i].n=i; order[0][1]=1; node[1].fa=0;}void traversal(int t) //从下往上依次沿父节点遍历,并用哈希方式存入数组。{ int a=t; int root=0; while(t!=root) { order[a][t]=1; t=node[t].fa; }}int find(int a,int b) //找出两个节点最近的父节点{ int m=a>b?a:b; for(int i=m;i>=1;i--) { if(order[a][i] && order[b][i]) { return i; } }}void add(int a,int b) //按遍历顺序读入ans数组{ int tmp=find(a,b); for(int i=a;i>=tmp;i--) { if(order[a][i]) { ans[res++]=i; cou[i]++; if(cou[i]>2) { f=0; return; } } } for(int i=tmp;i<=b;i++) { if(order[b][i]) { ans[res++]=i; cou[i]++; if(cou[i]>2) { f=0; return; } } }}void addlast(int t) //最后返回根节点经过的路径{ int root=0; t=node[t].fa; while(t!=root) { ans[res++]=t; cou[t]++; t=node[t].fa; if(cou[t]>2) { f=0; return; } }}int main(){ while(scanf("%d",&k)!=EOF) { ini(); for(int i=1;i<k;i++) { int a,b; scanf("%d %d",&a,&b); node[b].fa=a; node[a].ncount++; //用于判断最后一行有几个叶子节点,(是0的时候说明是叶节点) } int m=0; for(int i=1;i<=k;i++) if(node[i].ncount==0) m++; for(int i=1;i<=m;i++) { scanf("%d",&last[i]); traversal((last[i])); } last[0]=1; for(int i=0;i<m;i++) { add(last[i],last[i+1]); if(f==0) { printf("-1\n"); return 0; } } addlast(last[m]); if(f==0) { printf("-1\n"); return 0; } for(int i=0;i<res;i++) { printf("%d",ans[i]); if(i!=res-1) printf(" "); } printf("\n"); } return 0;}
0 0
- 【华为编码大赛】树遍历
- 华为OJ 二叉树遍历
- 【华为练习题】二叉树遍历
- 华为编程大赛
- 华为编程大赛2012
- 2010华为编程大赛
- 华为2015年编码大赛—笨笨熊搬家交通篇JAVA实现
- 华为编程大赛-字符串匹配
- 华为编程大赛决赛题
- 2012 华为编程大赛 语法分析
- 华为编程大赛--路径查找
- 华为编程大赛--出圈问题
- 华为编程大赛--字符串匹配
- 华为编程大赛--高精度加减法
- 华为编程大赛汇总----java
- 华为编程大赛-排序算法
- 华为编程大赛-字符串匹配
- 华为2014编程大赛初赛
- Java2Demo.jar
- Linux开源智能视频监控软件zoneminder的安装
- 如何搭建BigBlueButton开发环境(三)
- 【framework】spring-注解(annotation)
- 漫谈-----泛型(二)
- 【华为编码大赛】树遍历
- 学习《编程珠玑》
- run simple pageRank on Hadoop
- 结合Robotium和Monitor类来监控活动的创建
- Buiding 7z source code on Mac
- 自定义的annotation 使用方法
- Android 笔记-Fragment 与 Activity之间传递数据
- [leetcode]Jump Game &&Jump Game II
- DXUT框架中CModelCamera