Tree Reconstruction UVA - 10410
生活随笔
收集整理的這篇文章主要介紹了
Tree Reconstruction UVA - 10410
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目大意:給你一棵樹的層次遍歷和前序遍歷,讓你復原這棵樹
思路:這是分類討論的題,感覺挺難的
此題的關鍵,是要把已知的兩次遍歷配合起來。
考慮前序遍歷中的前后兩個點,分別記作A和B,那B點可能是A點的兄弟、兒子或者其他(叔叔之類)
而通過層次遍歷可以知道兩個點中誰更深,如果B點更深,那B點肯定是A的兒子;
如果B點和A點一樣深,那B點可能是兒子,也可能是兄弟,根據節點編號大小討論一下就好
如果B點沒有A點深,那B點只能是A點的長輩
所以,我們可以用棧模擬前序遍歷的過程,從而找到每個節點的父親
#include<iostream> #include<cstdio> #include<algorithm> #include<vector> #include<stack>using namespace std;const int N=1000+4;int n,a[N],b[N];stack<int>h;vector<int>g[N];int main() {while(scanf("%d",&n)!=EOF){for(int i=1;i<=n;i++)g[i].clear();int v;for(int i=1;i<=n;i++)scanf("%d",&v),a[v]=i;//節點在層次遍歷中的位置for(int i=1;i<=n;i++)scanf("%d",&b[i]);h.push(b[1]);//根節點int tmp;for(int i=2;i<=n;i++){while(a[b[i]]<a[h.top()])//需向上追溯 h.pop();if(a[b[i]]==a[h.top()]+1 && b[i]>h.top() && h.top()!=b[1])h.pop();//找到兄弟拉//既可以是兄弟也可以是父子的情況,我把它歸類到兄弟了//只要不滿足是兄弟,就一定是父子 g[h.top()].push_back(b[i]);h.push(b[i]);}int sz;for(int i=1;i<=n;i++){printf("%d:",i);sort(g[i].begin(),g[i].end());sz=g[i].size();for(int j=0;j<sz;j++)printf(" %d",g[i][j]);printf("\n");}}return 0; }?
轉載于:https://www.cnblogs.com/mgnfcnt/p/8486707.html
總結
以上是生活随笔為你收集整理的Tree Reconstruction UVA - 10410的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jmeter图片的下载
- 下一篇: 读取文件:TypeError: an i