#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
template <class elemType>
class linkQueue{
private:
struct node{
elemType data;
node *next;
node(const elemType &x,node *p=NULL){data=x; next=p;}
node():next(NULL){}
~node(){}
};
node *Front,*rear;
public:
linkQueue(){Front=rear=NULL;}
~linkQueue();
void enQueue(const elemType &x);
elemType deQueue();
bool isEmpty(){return (Front==NULL);}
elemType getHead(){return Front->data;}
};
template <class elemType>
linkQueue<elemType>::~linkQueue(){
node *q=Front,*p;
while(q!=NULL){
p=q->next;
delete q;
q=p;
}
}
template <class elemType>
void linkQueue<elemType>::enQueue(const elemType &x){
node *tmp;
if (Front==NULL) {
tmp=new node(x);
rear=Front=tmp;
}
else{
tmp=new node(x);
rear->next=tmp;
rear=tmp;
}
}
template <class elemType>
elemType linkQueue<elemType>::deQueue(){
node *tmp;
elemType value=Front->data;
tmp=Front;
Front=Front->next;
if (Front==NULL) rear=NULL;
delete tmp;
return value;
}
struct Node{
char data;
Node *left,*right;
Node(char x,Node *lt=NULL,Node *rt=NULL):data(x),left(lt),right(rt){}
Node():left(NULL),right(NULL){}
~Node(){}
};
Node *buildTree(char pre[],int s1,int e1,char mid[],int s2,int e2){
Node *p;
int pos;
if (s1>e1) return NULL;
p=new Node(pre[s1]);
for (int i=s2;i<=e2;i++)
if (mid[i]==pre[s1]){
pos=i;
break;
}
p->left=buildTree(pre,s1+1,s1+pos-s2,mid,s2,pos-1);
p->right=buildTree(pre,s1+pos-s2+1,e1,mid,pos+1,e2);
return p;
}
void result(Node *root,int l){
linkQueue<Node *> que;
Node *p;
int ct=0;
que.enQueue(root);
while ((!que.isEmpty())&& ct<l){
p=que.deQueue();
if (p) {cout<<p->data<<' '; ct++; que.enQueue(p->left); que.enQueue(p->right);}
else {cout<<"NULL"<<' '; que.enQueue(NULL); que.enQueue(NULL);}
}
}
int main()
{
char pre[27],mid[27];
Node *root;
int l1,l2;
cin>>pre;
cin>>mid;
l1=strlen(pre);
root=buildTree(pre,0,l1-1,mid,0,l1-1);
result(root,l1);
return 0;
}
SJTU OJ (1111)
最新推荐文章于 2021-07-20 21:15:50 发布