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

题意:

分析:

这题一开始完全没有思路, 一直没有找出规律。

参考了http://www.cnblogs.com/Wade-/p/6358859.html 和 http://www.cnblogs.com/jerryRey/p/4622927.html

在dfs序列中,相邻的两个结点u,v之间(dfs_pos(u) + 1 =  dfs_pos(v)),有父子,兄弟,其他3种关系。

父子关系:在bfs中u,v并不是相邻, bfs_pos(v) > bfs_pos(u) , 那么u为v父亲, v为u儿子。

兄弟关系:在bfs中, bfs(u) + 1 = bfs(v) (相邻).

其他关系:其实就是没有关系, bfs_pos(u) >= bfs_pos(v)

只要知道这3个关系, 就可以找出每个节点的父亲了, 用栈去模拟

#include <bits/stdc++.h>
using namespace std;
vector<int> son[1007];
int n;
int pos[1007];
int main(){
    while(~scanf("%d", &n)){
        for(int i = 0; i < n; i++){
            int t;
            scanf("%d", &t);
            pos[t] = i;
        }
        stack<int> s;
        int root;
        scanf("%d", &root);
        s.push(root);

        for(int i = 0; i < n - 1;i++){
            int x;
            scanf("%d", &x);
            for(;;){
                int u = s.top();
                if(pos[u] + 1 < pos[x] || u == root){//如果u与x不相邻而且pos(x) > pos(u)(bfs中序列, 根除外)
                    son[u].push_back(x);            // 那么u一定是x的父亲
                    s.push(x);
                    break;
                }
                else{
                    s.pop();
                }
            }
        }

        for(int i = 1; i <= n; i++){
            printf("%d:", i);
            sort(son[i].begin(), son[i].end());
            for(int j = 0; j < son[i].size(); j++){
                printf(" %d", son[i][j]);
            }
            son[i].resize(0);
            puts("");
        }
    }
}
时间: 2024-10-13 22:49:42

UVA - 10410 Tree Reconstruction (根据dfs序和bfs序恢复一颗树)的相关文章

uva 10410 - Tree Reconstruction(栈)

题目链接:uva 10410 - Tree Reconstruction 题目大意:给定一个树的BFS和DFS,求这棵树. 解题思路:用栈维护即可.对应BFS序列映射出了每个节点和根节点的距离,遍历dfs序列,对当前节点和栈顶节点比较,如果该节点距离根节点更远,则说明该节点为栈顶节点个孩子节点,则记录后将节点放入栈中.否则弹掉栈顶元素继续比较.需要注意一点,即当元素与栈顶元素的距离值大1的时候要视为相等,因为它们属于兄弟节点 #include <cstdio> #include <cst

UVA 10410 - Tree Reconstruction(树)

UVA 10410 - Tree Reconstruction 题目链接 题意:给定一个树的dfs序列和bfs序列,求出这颗树 思路:拿dfs的序列,分成若干段,每一段相当一个子树,这样就可以利用bfs的序列去将dfs的序列分段,然后利用一个队列去存放每一段,不断求出子树即可.一开始以为parse tree一定是二叉树,原来不一定啊. 代码: #include <cstdio> #include <cstring> #include <vector> #include

UVA - 10410 Tree Reconstruction

Description You have just finished a compiler design homework question where you had to find the parse tree of an expression. Unfortunately you left your assignment in the library, but luckily your friend picked it up for you. Instead of e-mailing yo

UVA - 10410 Tree Reconstruction (树重建)

题意:给定一个树的bfs和dfs序列,升序输出每个结点的子结点列表. 分析:因为建树不唯一,假定若bfs[u] = bfs[v] + 1,则u是v的兄弟结点,否则是孩子结点.用栈维护. #pragma comment(linker, "/STACK:102400000, 102400000") #include<cstdio> #include<cstring> #include<cstdlib> #include<cctype> #in

Tree Reconstruction UVA - 10410

这题是真的..不会.我的疑惑点主要在于两个相邻dfs数关系的多样性,因此中间我一直想枚举暴搜,发现不会写代码.然后注意到遍历一定是从小到大的,又不会利用这个性质..总之心态彻底被搞崩了,主要还是太菜. 题目描述:https://vjudge.net/problem/UVA-10410 网上比较详细的解释:https://www.cnblogs.com/jerryRey/p/4622927.html 核心思想主要是在等效吧,在dfs序与bfs序中同时相邻的情况中,兄弟关系与父子关系是等效的,此时就

UVa 536 Tree Recovery(先序,中序求后序)

题意  给你二叉树的先序序列和中序序列  求它的后序序列 先序序列的第一个一定是根  中序序列根左边的都属于根的左子树  右边的都属于右子树  递归建树就行了 #include <bits/stdc++.h> using namespace std; typedef struct TNode { char data; TNode *lc, *rc; } node, *BTree; void build(BTree &t, string pre, string in) { t = new

UVa 548 Tree (建树+前序后序)

Description You are to determine the value of the leaf node in a given binary tree that is the terminal node of apath of least value from the root of the binary tree to any leaf. The value of a path is the sum of valuesof nodes along that path.InputT

[2016-02-08][UVA][548][Tree]

UVA - 548 Tree Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description You are to determine the value of the leaf node in a given binary tree that is the terminal node of a path of least value from the root

UVA10410 - Tree Reconstruction(队列)

题目:UVA10410 - Tree Reconstruction(队列) 题目大意:给出一棵树的BFS和DFS遍历,求这棵数,如果有多种情况输出一种就可以了. 解题思路:利用BFS将DFS串分段,分成一棵一棵子树.然后将子树用队列存储下来,因为先被分出来的子树,在下一层中也是最先被分段.注意:一定要将根节点分离出去,它不属于它的子树.这棵树不一定是二叉树. 代码: #include <cstdio> #include <queue> #include <vector>