日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Tree Reconstruction UVA - 10410

發布時間:2025/3/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。