UVA - 10410 Tree Reconstruction(栈处理递归)
题目:
给出一棵树的BFS和DFS序列,输出这棵树中每个结点的子结点列表。BFS和DFS序列在生成的时候,当一个结点被扩展时,其所有子结点应该按照编号从小
到大的顺序访问。
思路:
一开始是想根据BFS和DFS序列来建树做这个题,但是利用BFS处理好分层之后就卡死了。
1.可以先处理好BFS中每个结点的距离。
2.在输入DFS时判断如果x点到根的距离比栈顶元素到根的距离多于1,那x就是栈顶元素的孩子结点,将x压入栈中。如果距离等于1说明x与栈顶元素是兄弟结点,
弹出栈定元素。
总结:
1.在DFS序列中距离相差为1的结点而且在BFS中距离也为1的两个结点的情况:父子关系,父亲结点是BFS所在层最右边的结点。
2.在DFS序列中距离相差为1的结点但在BFS中距离大于1:必定是父子关系。
3.在DFS序列中距离相差为1的结点但在BFS中距离小于1:说明在DFS序列中靠后的结点在BFS中的层数要小于DFS序列中靠前的结点。
如下边这个例子:
BFS:4 3 5 1 2 8 6 7
DFS:4 3 2 6 8 7 5 1

代码:
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define MAX 1000000009
#define FRE() freopen("in.txt","r",stdin)
#define FRO() freopen("out.txt","w",stdout)
using namespace std;
typedef long long ll;
const int maxn = ;
int bfs[maxn],n; int main() {
//FRE();
int root,x;
while(scanf("%d",&n)!=EOF) {
for(int i = ; i<n; i++) {
scanf("%d",&x);
bfs[x] = i;
}
stack<int> sta;
vector<int> ans[maxn];
scanf("%d",&root);
sta.push(root);
for(int i=; i<n; i++) {
scanf("%d",&x);
while(true) {
if((sta.top()==root) || (bfs[x]-bfs[sta.top()]>) ||//对应总结中的1、2点
(bfs[x]-bfs[sta.top()]==&&x<sta.top())) {
ans[sta.top()].push_back(x);
sta.push(x);
break;
} else {
sta.pop();
}
}
}
for(int i=; i<=n; i++) {
printf("%d:",i);
for(int j=; j<ans[i].size(); j++) {
printf(" %d",ans[i][j]);
}
printf("\n");
}
}
return ;
}
UVA - 10410 Tree Reconstruction(栈处理递归)的更多相关文章
- UVA - 10410 Tree Reconstruction (根据dfs序和bfs序恢复一颗树)
题意: 分析: 这题一开始完全没有思路, 一直没有找出规律. 参考了http://www.cnblogs.com/Wade-/p/6358859.html 和 http://www.cnblogs.c ...
- UVA 10410 Tree Reconstruction
题意: 给定一个树的BFS和DFS,求这棵树. 分析: 拿dfs的序列,分成若干段,每一段相当一个子树,这样就可以利用bfs的序列去将dfs的序列分段,然后利用一个队列去存放每一段,不断求出子树即可. ...
- UVa 548 Tree【二叉树的递归遍历】
题意:给出一颗点带权的二叉树的中序和后序遍历,找一个叶子使得它到根的路径上的权和最小. 学习的紫书:先将这一棵二叉树建立出来,然后搜索一次找出这样的叶子结点 虽然紫书的思路很清晰= =可是理解起来好困 ...
- UVA - 548 Tree(二叉树的递归遍历)
题意:已知中序后序序列,求一个叶子到根路径上权和最小,如果多解,则叶子权值尽量小. 分析:已知中序后序建树,再dfs求从根到各叶子的权和比较大小 #include<cstdio> #inc ...
- UVa 10410 树重建
Tree Reconstruction Problem Description You have just finished a compiler design homework question w ...
- UVA.548 Tree(二叉树 DFS)
UVA.548 Tree(二叉树 DFS) 题意分析 给出一棵树的中序遍历和后序遍历,从所有叶子节点中找到一个使得其到根节点的权值最小.若有多个,输出叶子节点本身权值小的那个节点. 先递归建树,然后D ...
- 栈->栈与递归
文字简述 1.阶乘函数 2.2阶Fiibonacci数列 3.n阶Hanoi塔问题 代码实现 // // Created by lady on 19-4-3. // #include <stdi ...
- 剑指offer_面试题5_从尾到头打印链表(栈和递归实现)
题目:输入一个链表的头结点,从尾到头反过来打印出每一个节点的值 考察 单链表操作.栈.递归等概念. 理解:要实现单链表的输出,那么就须要遍历.遍历的顺序是从头到尾.而节点输出的顺序是从尾到头.因此,先 ...
- 深度优先搜索入门:POJ1164城堡问题(递归、用栈模拟递归)
将问题的各状态之间的转移关系描述为一个图,则深度优先搜索遍历整个图的框架为:Dfs(v) {if( v 访问过)return;将v标记为访问过;对和v相邻的每个点u: Dfs(u);}int main ...
随机推荐
- 修改Android系统的触摸提示音【学习笔记】
平台信息:内核:Linux version 3.10.0系统:android/android6.0平台:rk3288 作者:庄泽彬(欢迎转载,请注明作者) 邮箱:2760715357@qq.com 本 ...
- web filter用spring注入对象
tomcat容器初始化顺序监听器–>过滤器–>servlet,因此springMVCservlet初始化之前,过滤器就已经初始化过了,如果在过滤器中需要注入spring容器管理的bean是 ...
- Python中关键字global与nonlocal的区别
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xCyansun/article/details/79672634终于下定决心学习Python了.既然 ...
- Java 泛型 一
泛型在Java中有很重要的地位,网上很多文章罗列各种理论,不便于理解,本篇将立足于代码介绍.总结了关于泛型的知识. 先看下面的代码: List list = new ArrayList(); list ...
- Nginx(三) 常用配置整理
#定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_processes 8; #全局错误日志定义类型,[ debug | ...
- Extjs grid禁用头部点击三角下拉菜单
表格头部的三角在点击的时候禁止出现下拉菜单,给每一列添加属性menuDisabled:true xtype:'grid', enableColumnResize:false, columns:[ {t ...
- 公司5:JrVue表格
组件名称:jr-dynamic-query-table 组件布局 table组件名称: jr-dynamic-query-table 分页组件名称: el-pagination <div re ...
- 题解报告:poj 1426 Find The Multiple(bfs、dfs)
Description Given a positive integer n, write a program to find out a nonzero multiple m of n whose ...
- Markdown基本语法学习
Markdown是一种纯文本格式的标记语言.通过简单的标记语法,它可以使普通文本内容具有一定的格式. 创始人 John Gruber 的 Markdown 语法说明 Markdown 中文版语法说明 ...
- centos源码编译安装nginx过程记录
前言:Centos系统编译安装LNMP环境是每来一台新服务器或换电脑都需要做的事情.这里仅做一个记录.给初学者一个参考! 一.安装前的环境 这里用的是centos 7系统. 我们默认把下载的软件放在 ...