0
点赞
收藏
分享

微信扫一扫

【1086】Tree Traversals Again (25 分)

是她丫 2022-07-14 阅读 75


#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
const int maxn=50;
struct node{
int data;
node* lchild;
node* rchild;
};
int pre[maxn],in[maxn],post[maxn]; //先、中、后序
int n; //结点个数


//当前二叉树的先序序列区间为[preL,preR],中序序列区间为[inL,inR]
//create函数返回构建出的二叉树的根结点地址
node* create(int preL,int preR,int inL,int inR){
if(preL>preR){
return NULL;
}
node* root=new node;//新建一个新的结点,用来存放当前二叉树的根结点
root->data=pre[preL];//新结点的数据域为根结点的值
int k;//这个k不要在for里面定义了,注意有效域
for(k=inL;k<=inR;k++){
if(in[k]==pre[preL]){ //在中序序列中找到in[k]==pre[L]的结点
break;
}
}
int numLeft=k-inL; //左子树的结点个数
//返回左子树的根结点地址,赋值给root的左指针
root->lchild=create(preL+1,preL+numLeft,inL,k-1);
//返回右子树的根结点地址,赋值给root的右指针
root->rchild=create(preL+numLeft+1,preR,k+1,inR);
return root; //返回根结点地址
}

int num=0;//已输出的结点个数
void postorder(node* root){//后序遍历
if(root==NULL){
return;
}
postorder(root->lchild);
postorder(root->rchild);
printf("%d",root->data);
num++;
if(num<n) printf(" ");
}
int main(){
scanf("%d",&n);
char str[5];
stack<int> st;
int x,preIndex=0,inIndex=0; //入栈元素、先序序列位置及中序序列位置
for(int i=0;i<2*n;i++){ //出栈入栈共2n次
scanf("%s",str);
if(strcmp(str,"Push") == 0){ //入栈
scanf("%d",&x);
pre[preIndex++]=x; //令pre[preIndex]=x
st.push(x);
}else{
in[inIndex++]=st.top(); //令in[inIndex]=st.top
st.pop();
}
}
node* root=create(0,n-1,0,n-1); //建树
postorder(root); //后序遍历
system("pause");
return 0;
}

 

举报

相关推荐

0 条评论