PAT 1020. Tree Traversals (25)

来源:互联网 发布:windows垃圾清理软件 编辑:程序博客网 时间:2024/06/03 17:22


题意:给出后序和中序遍历,求水平序列。

思路:

用递归做,注意root要事先建立。还有就是递归处的边界选择。

#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#include<stack>#include<vector>#include<queue>#include<string>#include<map>using namespace std;#define INF 99999999#define M 300struct node{int data;struct node *lchild,*rchild;};int posto[M],mido[M];struct node* buildtree(int ml,int mr,int pl,int pr){int i=0;if(ml>mr || pl >pr)return NULL;int proot=posto[pr];for(i=ml;i<=mr;i++)if(mido[i]==proot){break;}struct node *Node;Node = (struct node*)malloc(sizeof(struct node));Node->data=proot;Node->rchild = buildtree(i+1,mr,pr-1-(mr-i-1),pr-1);Node->lchild = buildtree(ml,i-1,pl,pl+(i-1-ml));return Node;}void levelprint(struct node *root){struct node *Node;vector<int> ans;queue<struct node*> q;q.push(root);while(!q.empty()){Node = q.front();q.pop();ans.push_back(Node->data);if(Node->lchild != NULL)q.push(Node->lchild);if(Node->rchild !=NULL)q.push(Node->rchild);}int i;for(i=0;i<ans.size();i++){printf("%d",ans[i]);if(i!=ans.size()-1)printf(" ");else printf("\n");}}//start  21:54//end    22:25int main(){int i,n;struct node *root;cin>>n;for(i=0;i<n;i++)scanf("%d",&posto[i]);for(i=0;i<n;i++)scanf("%d",&mido[i]);root = (struct node*)malloc(sizeof(struct node));root = buildtree(0,n-1,0,n-1);levelprint(root);return 0;}