【1086】Tree Traversals Again (25 分)
【摘要】
#include<iostream>#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>#include<algorithm> #include<map>#inclu...
-
#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;
-
}
文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。
原文链接:andyguo.blog.csdn.net/article/details/98268828
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)