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;
}

大概唯一要注意的地方就是指针不要指空

posted @ 2020-10-22 17:25  HUIZIXUAN  阅读(134)  评论(0编辑  收藏  举报