题目大意:给出对一棵树的BFS遍历序列和DFS遍历序列,求出每一个节点的子节点。

题目分析:在BFS的序列中,子节点的下标一定比父节点的下标至少大1(根节点与第一个子节点除外),即pos[fa]+1<pos[son]。当节点u、v满足pos[u]+1==pos[v]时,u和v为兄弟节点。只需循环一遍DFS序列便可递归的找出所有节点的子节点。循环一遍DFS序列实际上就是一个深搜的过程。

代码如下:

# include<iostream>
# include<cstdio>
# include<vector>
# include<stack>
# include<cstring>
# include<algorithm>
using namespace std; vector<int>v[1001];
int pos[1001];
stack<int>s; int main()
{
int n,a;
while(~scanf("%d",&n))
{
for(int i=1;i<=n;++i){
scanf("%d",&a);
v[i].clear();
pos[a]=i;
} while(!s.empty())
s.pop();
int root;
scanf("%d",&root);
s.push(root);
for(int i=1;i<n;++i){
scanf("%d",&a);
while(1){
int u=s.top();
if(u==root||pos[u]+1<pos[a]){///pos[u]+1==pos[a]时,u和a为兄弟节点
v[u].push_back(a);
s.push(a);///深搜又加深了一层
break;///一旦找到a的父节点便找序列中的下一个节点的父节点
}else
s.pop();
}
} for(int i=1;i<=n;++i){
printf("%d:",i);
int l=v[i].size();
for(int j=0;j<l;++j)
printf(" %d",v[i][j]);
printf("\n");
}
}
return 0;
}

  

最新文章

  1. 虚拟机上装uoj
  2. JS详细入门教程(上)
  3. 做贴吧系统,偶然发现使用iframe的弊端
  4. Intent和Activity知识点总结
  5. percona-toolkit工具包的使用教程之开发类工具
  6. 《Play for Java》学习笔记(一)项目框架
  7. 【转载】高性能I/O设计模式Reactor和Proactor
  8. S70卡
  9. unity3d插件Daikon Forge GUI 中文教程-1-Daikon Forge介绍
  10. chrome使用技巧整理
  11. 开发一个项目之ES2015+
  12. Linux 环境变量梳理
  13. 算法笔记_227:填写乘法算式(Java)
  14. ns-3
  15. Json反序列化为动态类型(dynamic)
  16. Oracle密码过期设置和修改密码问题
  17. zabbix前端添加平台脚本监控
  18. (转)《linux性能及调优指南》 3.3 内存瓶颈
  19. android UI&#160;适配小节
  20. 42:换汽水瓶ExchangeBottle

热门文章

  1. ZOJ 3203 Light Bulb
  2. LightGBM值参数配置
  3. python面向对象(类和对象及三大特性)
  4. Google I/O 2014 - Keynote for Android
  5. centos7.3下ScyllaDB1.6安装
  6. JDK eclipse selenium的安装以及环境变量的配置
  7. SAMBA服务器的安装和配置实践
  8. linux 常用命令总结(一)
  9. 微信小程序中公用内容
  10. Refactoring #001 Extract Method