PATL2-006. 树的遍历

来源:互联网 发布:ubuntu 麒麟wineqq 编辑:程序博客网 时间:2024/04/28 07:19

用的是递归的思想,找到每一层的根节点,然后进行建树。最后用个bfs将这个树输出

AC代码:

/* ***********************************************Author        :yzkAcceptedCreated Time  :2016/7/11 20:28:05TASK  :ggfly.cppLANG          :C++************************************************ */#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <cmath>#include <cstdlib>#include <ctime>#include <stack>using namespace std;const int maxn=50;int mid[maxn],be[maxn];struct node{int l,r;}a[maxn];int build(int la,int ra,int lb,int rb)//la,ra表示中序遍历 lb,rb表示后序遍历{if(la>ra)return 0;int rt=be[rb],p1,p2;p1=la;while(mid[p1]!=rt)p1++;//在中序遍历中找到根节点p2=p1-la;a[rt].l=build(la,p1-1,lb,lb+p2-1);a[rt].r=build(p1+1,ra,lb+p2,rb-1);return rt;}void bfs(int x)//层序遍历{queue<int>q;vector<int>v;q.push(x);while(!q.empty()){int w=q.front();q.pop();if(w==0)break;v.push_back(w);if(a[w].l!=0)q.push(a[w].l);if(a[w].r!=0)q.push(a[w].r);}int len=v.size();for(int i=0;i<len;i++)printf("%d%c",v[i],i==len-1?'\n':' ');return;}int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);int n,i,j;cin>>n;for(i=0;i<n;i++) scanf("%d",&be[i]);for(i=0;i<n;i++) scanf("%d",&mid[i]);build(0,n-1,0,n-1);int root=be[n-1];bfs(root);    return 0;}


1 1
原创粉丝点击