USACO 3.4American Heritage 中序,前序构建二叉树

来源:互联网 发布:mac如何强制关闭软件 编辑:程序博客网 时间:2024/05/20 18:18

USACO 3.4American Heritage
http://www.nocow.cn/index.php/Translate:USACO/heritage
思路就是: 画个简单二叉树,写出它的前序和中序。。然后把自己当成电脑,把模拟过程,转化为一行行递归的代码

/*ID: m1562501LANG: C++TASK: heritage*/#include <cstdio>#include<iostream>#include<string>#include<stdlib.h>#include<map>#include<string.h>#include<vector>#include <cmath>#include<algorithm>#include<set>#include<bitset>using namespace std;typedef long long ll;char a[100],b[100];struct node{  char val;  node *left,*right;};void build(int l,int r,int rt,node *e){  //   printf("%d %d %d %c\n",l,r,rt,e->val);   for(int i=l;i<=r;i++)   {      if(a[i]==b[rt])      {        if(l<=i-1)        {           node *le=(struct node *)malloc(sizeof(struct node));           le->val =b[rt+1]; le->left =NULL ; le->right =NULL;           e->left =le;          //      printf("le-val %c \n",le->val);              if(l<i-1)           build(l,i-1,rt+1,le);        }         if(i+1<=r)        {            node *re=(struct node *)malloc(sizeof(struct node));            re->val =b[rt+i-l+1]; re->left =NULL ; re->right =NULL;            e->right=re;        // printf("re-val %c \n",re->val);         if(i+1<r)            build(i+1,r,rt+i-l+1,re);        }        return ;      }   }}int cnt=0; void print(node *root){    // printf("%c \n",root->val );    if(root->left!=NULL)    {     print(root->left)  ;    }    if(root->right!=NULL)    {         print(root->right) ;    }    //if(root->val>='A'&&root->val<='Z')    printf("%c",root->val);}int main(){    freopen("F:\\123.txt","r",stdin);   // freopen("heritage.in","r",stdin);   // freopen("heritage.out","w",stdout);    int n;      scanf("%s%s",a+1,b+1);      node *root=(struct node*)malloc(sizeof(struct node));      node *tmp=(struct node*)malloc(sizeof(struct node));      root->val=b[1];      root->left =tmp;     // printf("len %d\n",strlen(a+1));      build(1,strlen(a+1),1,root);      print(root);      printf("\n");     return 0;}
0 0
原创粉丝点击