hdu1710-求二叉树后序遍历
题意是给出先序遍历和中序遍历求后序遍历。
显然,先序遍历的第一个数字就是整棵树的根。我们找到该数字在中序遍历中出现的位置,前半部分就是根的左子树,后半部分就是右子树。
按照这种思路,我们每次递归左右子树,都先从先序遍历中找到该子树的根,从而确定整棵树。
代码如下
#include<bits/stdc++.h> typedef long long ll; const int N=1010; using namespace std; int pre[N],in[N],post[N];//先序,中序,后序 int k; struct node { int valve; node *l,*r; node(int valve=0,node *l = NULL,node *r = NULL):valve(valve),l(l),r(r){} }; void buildtree(int l,int r,int &t,node * &root) { int flag=-1; for(int i=l;i<=r;i++) { if(in[i]==pre[t]) { flag=i;break; } } if(flag==-1) return; root=new node(in[flag]); //新建结点 t++; buildtree(l,flag-1,t,root->l); buildtree(flag+1,r,t,root->r); } void postorder(node *root) { if(root!=NULL) { postorder(root->l); postorder(root->r); post[k++] = root ->valve; } } //这个释放内存不加也可以 void remove_tree(node *root) { if(root==NULL) return; remove_tree(root->l); remove_tree(root->r); delete root; } int main() { int n; while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) scanf("%d",&pre[i]); for(int i=1;i<=n;i++) scanf("%d",&in[i]); node *root; int t=1; buildtree(1,n,t,root); k = 0; postorder(root); for(int i=0;i<k;i++) { printf("%d%c",post[i],i==k-1?'\n':' '); } remove_tree(root); } return 0; }
大概唯一要注意的地方就是指针不要指空