hdu 1710 binary tree traversals 二叉树遍历

来源:互联网 发布:手机淘宝网商城首页 编辑:程序博客网 时间:2024/05/17 07:56

根据二叉树的前序遍历和中序遍历求后序遍历的题。

一开始的方法是根据前序遍历和中序遍历构建二叉树,再从二叉树开始后序遍历。事实证明我还是too young too naive,一开始还好好的,后来这递归被我越写越糟糕,都看不下去了,好不容易程序运行起来了,对了下答案也没问题,就交了上去,结果返回了RE……………………

好难过啊QAQ

于是去搜题解,发现有人说用结构构建树用了太多空间导致RE,但我觉得不应该啊QAQ,然后又找到个人也是构建了树再遍历的,不过他用的是指针,我直接开的两个整型来保存。(喵的现在这天气居然有人进来还开空调(╯‵□′)╯ノ┻━┻☆)可能就是这两个整型导致RE了?

总之先贴上错误的代码……


#include<cstdio>#include<iostream>#define MAXN 2005#define Lc (id<<1)#define Rc (Lc|1)using namespace std;int preorder[MAXN], inorder[MAXN], postorder[MAXN];int tree[MAXN*4];bool haveval[MAXN*4];int orderpoint;int search(int sx, int ex, int target){for(int i=sx;i<=ex;i++){if(inorder[i]==target)return i;}}int id;void buildtree(int left, int mid, int right, int id){if(left==right){return ;}bool inleft=false;int leftu, rightu;tree[id]=inorder[mid];haveval[id]=true;if(left<=mid-1){orderpoint++;leftu=search(left, mid-1, preorder[orderpoint]);}else leftu=left;if(left<=mid-1)buildtree(left, leftu, mid-1, Lc);if(mid!=leftu){tree[Lc]=inorder[leftu];haveval[Lc]=true;inleft=true;}if(mid+1<=right){orderpoint++;rightu=search(mid+1, right, preorder[orderpoint]);}else rightu=right;if(mid+1<=right)buildtree(mid+1, rightu, right, Rc);if(mid!=rightu){if(!inleft){tree[Lc]=inorder[rightu];haveval[Lc]=true;}else {tree[Rc]=inorder[rightu];haveval[Rc]=true;}}}void postsearch(int id){if(!haveval[id])return ;postorder[++orderpoint]=tree[id];postsearch(Rc);postsearch(Lc);}int main(){int n;while(cin>>n){memset(haveval, false, sizeof(haveval));for(int i=0;i<n;i++)scanf("%d", &preorder[i]);for(int i=0;i<n;i++){scanf("%d", &inorder[i]);if(inorder[i]==preorder[0])id=i;}orderpoint=0;buildtree(0, search(0, n-1, preorder[0]), n-1, 1);orderpoint=0;postsearch(1);for(int i=n;i>=2;i--)printf("%d ", postorder[i]);cout<<postorder[1]<<endl;}return 0;}


总而言之暂时没想到哪里错了Orz……本渣还是研究下题解重写吧Orz……

*******************重写完毕************************

来个AC的代码

#include<cstdio>#include<iostream>using namespace std;#define MAXN 1005int preorder[MAXN], inorder[MAXN], postorder[MAXN];int prept, postpt;void search(int left, int right){if(left>right)return ;if(left==right){postorder[postpt++]=inorder[left];prept++;return ;}int inpt;for(inpt=left;inorder[inpt]!=preorder[prept];inpt++);prept++;search(left, inpt-1);search(inpt+1, right);postorder[postpt++]=inorder[inpt];}int main(){int n;while(cin>>n){for(int i=1;i<=n;i++)scanf("%d", &preorder[i]);for(int i=1;i<=n;i++)scanf("%d", &inorder[i]);prept=1;postpt=1;search(1, n);for(int i=1;i<n;i++)printf("%d ", postorder[i]);cout<<postorder[n]<<endl;}return 0;}



原创粉丝点击