hdu 1710 binary tree traversals 二叉树遍历
2013-09-30 09:39
417 查看
根据二叉树的前序遍历和中序遍历求后序遍历的题。
一开始的方法是根据前序遍历和中序遍历构建二叉树,再从二叉树开始后序遍历。事实证明我还是too young too naive,一开始还好好的,后来这递归被我越写越糟糕,都看不下去了,好不容易程序运行起来了,对了下答案也没问题,就交了上去,结果返回了RE……………………
好难过啊QAQ
于是去搜题解,发现有人说用结构构建树用了太多空间导致RE,但我觉得不应该啊QAQ,然后又找到个人也是构建了树再遍历的,不过他用的是指针,我直接开的两个整型来保存。(喵的现在这天气居然有人进来还开空调(╯‵□′)╯ノ┻━┻☆)可能就是这两个整型导致RE了?
总之先贴上错误的代码……
总而言之暂时没想到哪里错了Orz……本渣还是研究下题解重写吧Orz……
*******************重写完毕************************
来个AC的代码
一开始的方法是根据前序遍历和中序遍历构建二叉树,再从二叉树开始后序遍历。事实证明我还是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 1005 int 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 <<endl; } return 0; }
相关文章推荐
- hdu1710 Binary Tree Traversals(二叉树遍历)
- HDU--1710--Binary Tree Traversals(二叉树遍历)
- HDU 1710 Binary Tree Traversals (二叉树遍历)
- HDU-1710 Binary Tree Traversals 二叉树遍历
- HDU 1710 Binary Tree Traversals(二叉树遍历)
- HDU---1710-Binary Tree Traversals (二叉树遍历)
- HDU 1710 Binary Tree Traversals(二叉树遍历)
- HDU-1710-Binary Tree Traversals
- HDU 1710 Binary Tree Traversals(前序中序后序遍历)
- hdu——1710——Binary Tree Traversals
- HDU 1710 Binary Tree Traversals
- 已知树的前序和中序求后序 hdu 题目1710 Binary Tree Traversals
- hdu 1710 Binary Tree Traversals 前序遍历和中序推后序
- hdu 1710 Binary Tree Traversals
- hdu 1710 Binary Tree Traversals
- hdu 1710 Binary Tree Traversals
- HDU - 1710 Binary Tree Traversals (给前序,中序,求后序)
- HDU 1710 Binary Tree Traversals 二叉树
- HDU 1710 Binary Tree Traversals(已知先序中序求后序)
- HDU 1710 Binary Tree Traversals