PAT(Advanced Level) 1020 Tree Traversals 解题报告

来源:互联网 发布:java开发语音 编辑:程序博客网 时间:2024/06/03 06:00

题目链接http://pat.zju.edu.cn/contests/pat-a-practise/1020

本题要求根据二叉树的后序遍历序列和中序遍历序列重建二叉树,然后层序遍历之,并输出。

实现之前,需要各位熟悉这个过程(自行查看相关书籍),能够在白纸上模拟。

笔者使用树的链式存储给出C++实现。

#include<iostream>#include<vector>#include<queue>using namespace std;struct BinaryNode{int data;BinaryNode *left;BinaryNode *right;BinaryNode(int d,BinaryNode *l=NULL,BinaryNode *r=NULL):data(d),left(l),right(r){}};BinaryNode *root;vector<int> levelorder;BinaryNode* CreateTree(int post[],int s1,int e1,int in[],int s2,int e2){if(s1>e1)        //边界情形不是s1==e1,而是s1>e1!return NULL;BinaryNode *binnode=new BinaryNode(post[e1]);if(s1<e1){int i;for(i=s2;i<=e2;i++)if(in[i]==post[e1])break;int len=i-s2;binnode->left=CreateTree(post,s1,s1+len-1,in,s2,i-1);binnode->right=CreateTree(post,s1+len,e1-1,in,i+1,e2);}return binnode;}void LevelOrder(BinaryNode *r){queue<BinaryNode*> q;q.push(r);while(!q.empty() ){BinaryNode *temp=q.front();levelorder.push_back(temp->data);q.pop();if(temp->left!=NULL)q.push(temp->left);if(temp->right!=NULL)q.push(temp->right);}}int main(){int n;cin>>n;int postorder[32],inorder[32];for(int i=0;i<n;i++)cin>>postorder[i];for(int i=0;i<n;i++)cin>>inorder[i];root=CreateTree(postorder,0,n-1,inorder,0,n-1);LevelOrder(root);cout<<levelorder[0];for(int i=1;i<n;i++)cout<<" "<<levelorder[i];cout<<endl;//system("pause");return 0;}