题目:

给出一棵树的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(栈处理递归)的更多相关文章

  1. UVA - 10410 Tree Reconstruction (根据dfs序和bfs序恢复一颗树)

    题意: 分析: 这题一开始完全没有思路, 一直没有找出规律. 参考了http://www.cnblogs.com/Wade-/p/6358859.html 和 http://www.cnblogs.c ...

  2. UVA 10410 Tree Reconstruction

    题意: 给定一个树的BFS和DFS,求这棵树. 分析: 拿dfs的序列,分成若干段,每一段相当一个子树,这样就可以利用bfs的序列去将dfs的序列分段,然后利用一个队列去存放每一段,不断求出子树即可. ...

  3. UVa 548 Tree【二叉树的递归遍历】

    题意:给出一颗点带权的二叉树的中序和后序遍历,找一个叶子使得它到根的路径上的权和最小. 学习的紫书:先将这一棵二叉树建立出来,然后搜索一次找出这样的叶子结点 虽然紫书的思路很清晰= =可是理解起来好困 ...

  4. UVA - 548 Tree(二叉树的递归遍历)

    题意:已知中序后序序列,求一个叶子到根路径上权和最小,如果多解,则叶子权值尽量小. 分析:已知中序后序建树,再dfs求从根到各叶子的权和比较大小 #include<cstdio> #inc ...

  5. UVa 10410 树重建

    Tree Reconstruction Problem Description You have just finished a compiler design homework question w ...

  6. UVA.548 Tree(二叉树 DFS)

    UVA.548 Tree(二叉树 DFS) 题意分析 给出一棵树的中序遍历和后序遍历,从所有叶子节点中找到一个使得其到根节点的权值最小.若有多个,输出叶子节点本身权值小的那个节点. 先递归建树,然后D ...

  7. 栈->栈与递归

    文字简述 1.阶乘函数 2.2阶Fiibonacci数列 3.n阶Hanoi塔问题 代码实现 // // Created by lady on 19-4-3. // #include <stdi ...

  8. 剑指offer_面试题5_从尾到头打印链表(栈和递归实现)

    题目:输入一个链表的头结点,从尾到头反过来打印出每一个节点的值 考察 单链表操作.栈.递归等概念. 理解:要实现单链表的输出,那么就须要遍历.遍历的顺序是从头到尾.而节点输出的顺序是从尾到头.因此,先 ...

  9. 深度优先搜索入门:POJ1164城堡问题(递归、用栈模拟递归)

    将问题的各状态之间的转移关系描述为一个图,则深度优先搜索遍历整个图的框架为:Dfs(v) {if( v 访问过)return;将v标记为访问过;对和v相邻的每个点u: Dfs(u);}int main ...

随机推荐

  1. luogu2540 斗地主增强版

    题目大意 给你一副手牌,没有飞机带翅膀,按斗地主的规则,求将所有牌打出的最少次数. 题解 先不考虑顺子 我们已经知道花色对牌没有影响,那么如果不考虑顺子,每个牌具体是什么数字我们也用不着知道,我们关心 ...

  2. ios23--动画做弹出提示框toast

    ) { /* [UIView animateWithDuration:2.0 animations:^{ // 执行动画 self.showHUB.text = @"当前购物车已空,赶紧买买 ...

  3. iOS:界面适配(二)--iPhone/iPad适配(关于xib)

    本文纯属个人看法,强迫症后遗症 版本:xcode 6.0 + iOS SDK 8.0 讨论范围:控制器的view(创建VC时自带的xib) ------------------------------ ...

  4. 4.9 Parser Generators

    4.9 Parser Generators This section shows how a parser generator can be used to facilitate the constr ...

  5. linux shell 实例1

    UI项目删除“UIL”文件中的无用字串: 脚本需要制定UIL文件目录位置&无用字串的txt文件,如删除海尔目录下的无用字串: ./delete_uil_string.sh ./haier/UI ...

  6. 栗染-github中搭建博客遇到的问题之一

    运行命令:git push -u origin master To https://github.com/xuzhezhaozhao/Practice.git ! [rejected] master ...

  7. P2476 [SCOI2008]着色方案

    传送门 数学太珂怕了--膜一下->这里 记\(sum[i]\)为题中\(c[i]\)的前缀和,\(C[i][j]\)表示\(C_{i}^j\) 设\(f[i][j]\)表示前面\(i\)中颜色已 ...

  8. ECMA里面的一元符

    只能操作一个值的叫做一元操作符.一元操作符是ECMAScript中最简单的操作符 1.递增和递减操作符 递增和递减操作符直接借鉴自c,而且各有俩个版本,前置型和后置型.顾名思义,前置型就是位于要操作的 ...

  9. 2017杭电多校第五场11Rikka with Competition

    Rikka with Competition Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/O ...

  10. 贪心+优先队列 HDOJ 5360 Hiking

    题目传送门 /* 题意:求邀请顺序使得去爬山的人最多,每个人有去的条件 贪心+优先队列:首先按照l和r从小到大排序,每一次将当前人数相同的被邀请者入队,那么只要能当前人数比最多人数条件小,该人能 被邀 ...