欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

1086. Tree Traversals Again (25)

程序员文章站 2022-07-08 16:43:21
...

1086. Tree Traversals Again (25)

#include<iostream> 
#include <sstream>   //将string转化成int 
#include<string>     //定义string类型字符串 
#include<stack>  
#define MAXSIZE 100
using namespace std;  

typedef int ElemType;
struct BTNode{
	ElemType data;
	BTNode * lchild;
	BTNode * rchild;
};

//先序+中序=建树   
BTNode *  PreInCreate(ElemType pre[],ElemType in[],int len){  
    if(pre==NULL || in==NULL || len<=0) return NULL;  
    int i=0;  
    BTNode * T=new BTNode;  
    T->lchild=T->rchild=NULL;  
    int leftlen,rightlen;  
    ElemType tmp=pre[0];  
      
    T->data=tmp;  
      
    while(i<len){  
        if(in[i]!=tmp) i++;  
        else   break;         
    }  
      
    leftlen=i;rightlen=len-i-1;  
    if(leftlen>0) T->lchild=PreInCreate(pre+1,in,leftlen);  
    if(rightlen>0) T->rchild=PreInCreate(pre+leftlen+1,in+leftlen+1,rightlen);  
    return T;  
}  

//后序遍历    
void PostOrder(BTNode * T,bool flag){    //flag=true表示可以输出空格 
    //这步判断一定要有,处理建树时的return NULL     
    if(T){    
        PostOrder(T->lchild,true);    
        PostOrder(T->rchild,true);    
        cout<<T->data;   
		if(!flag) flag=true;
		else   cout<<" ";   
    }     
}  
  
int  main(){  
	//freopen("input.txt","r",stdin);
	int n;    
	stringstream ss;  
	string Nstr;  
    getline(cin,Nstr);  
    ss << Nstr; ss >> n; ss.clear();  //cout<<n;  
    
    
	stack<int> myStack;
	int pre[MAXSIZE],in[MAXSIZE];
	string key; int data;

	int preidx=0,inidx=0;
	
	
	for(int i=0;i<2*n;i++){
		getline(cin,key);
		//cout<<key[1]<<"hahaha";return 0;
		if(key[1]=='u'){ //"u"表示字符串,'u'表示一个字符 
			string datastr=key.substr(5);
			ss<<datastr; ss>>data; ss.clear();
			pre[preidx++]=data;
			myStack.push(data); 
		}else{
			int tmp=myStack.top();
			in[inidx++]=tmp;
			myStack.pop();			
		}		
	}

	BTNode * T;
	T=PreInCreate(pre,in,preidx); //因为最后一步多+1 
	PostOrder(T,false); 

	return 0;  
}