Advertisement

UVa 10410 树重建

阅读量:

根据一组bfs序列与一组dfs序列推导出所有节点的子节点关系,所涉及的树结构不一定是二叉树。
优先处理数值较小的节点。

本题解法以dfs序为起点,结合bfs序中各节点的相对位置关系,可以确定各个节点之间的父子关系。
以下通过一个实例进行说明:
4 3 5 1 2 8 7 6
4 3 1 7 2 6 5 8

首先确定4为根节点,将其压入栈中。
接着是3,在bfs序列中,4是根节点,因此3成为其子节点,并被压入栈。
随后是1,在bfs序列中,1与3的位置间隔超过1,因此二者并非兄弟节点,只能判定为3的子节点,并将其压入栈。
接下来是7,在bfs序列中,7与1的位置间隔也超过1,说明二者不是兄弟关系,则7应为1的子节点,并被压入栈。
随后出现的是2,在bfs序列中,2的位置明显在7之前,因此将7弹出栈。此时比较2与当前栈顶元素1的位置差为1,则判定二者为兄弟关系,并将1弹出栈。接着比较2与新的栈顶元素3的位置差大于1,则判定2为3的子节点,并将其压入栈。

………………

复制代码
    #include<bits/stdc++.h>
    using namespace std;
    
    const int maxn = 1000 + 10;
    int pos[maxn];
    vector<vector<int>> tree;

全部评论 (0)

还没有任何评论哟~