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;}
- 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(二叉树的后序遍历)
- HDOJ 1710Binary Tree Traversals 二叉树的遍历
- HDU 1701 Binary Tree Traversals 【二叉树】
- 重建二叉树 Binary Tree Traversals HDU
- HDU 1710 - Binary Tree Traversals(树的遍历)
- HDU 1710 Binary Tree Traversals(二叉树)
- 安卓开发者必备工具:Wifi无线调试
- TextKit学习(三)NSTextStorage,NSLayoutManager,NSTextContainer和UITextView
- oracle 10g expdp ORA-00980: synonym translation is no longer valid
- 3
- TextKit学习(四)通过boundingRectWithSize:options:attributes:context:计算文本尺寸
- hdu 1710 binary tree traversals 二叉树遍历
- POJ 3211洗衣服
- HG常用命令和场景(三)--版本差别查看
- Spring MVC的处理请求流程问题
- MyEclipse导入项目错误:Could not find the main class.Program will exit.
- 新搜索算法“Hummingbird”将是Google进军语义搜索的核心
- Linux内核探讨-- 第二章
- 我的长期计划
- 技术面试的方式