Consulte 03-Tree 2. Tree Traversals De nuevo escrito en este artículo . En la parte del curso de la imagen, el Sr. Chen Yue habló sobre otra solución a este problema. No es necesario generar un árbol binario e imprimir directamente el siguiente secuencia transversal. No puedo escribir.
Dos partes del código: use la pila de matrices para almacenar la secuencia de recorrido en orden:
for(int i=0;i<2*N;++i){
//利用栈生成中序遍历序列
if(command[i]==-1){
In[InNum++]=stack[--top];
}
if(command[i]!=-1){
stack[top++]=command[i];
}
}
Recorrido posterior, el uso de variables estáticas para controlar el formato de salida.
void PostTraversal(TreeNode *root){
static int t = 0; //这个静态变量的使用自己写不出来,目的是为了控制输出格式
if(root){
PostTraversal(root->Left);
PostTraversal(root->Right);
if(t==0){
printf("%d",root->Data);
t = 1;
}
else{
printf(" %d",root->Data);
}
}
}
#include<stdio.h>
#include<string.h>//strcmp
#include<stdlib.h>//malloc
typedef struct TreeNode *PTree;
struct TreeNode{
int Data;
PTree Left;
PTree Right;
};
void PostTraversal(TreeNode *root){
static int t = 0; //这个静态变量的使用自己写不出来,目的是为了控制输出格式
if(root){
PostTraversal(root->Left);
PostTraversal(root->Right);
if(t==0){
printf("%d",root->Data);
t = 1;
}
else{
printf(" %d",root->Data);
}
}
}
int input(void){
char read[5],Push[5]="Push",Pop[5]="Pop";
int t;
scanf("%s",read);
if(!strcmp(read,Push)){
scanf("%d",&t);
return t;
}
if(!strcmp(read,Pop)){
return -1;
}
}
PTree create(int *Pre,int *In,int len){
PTree p;
int i;
if (!len) return NULL;//我把return NULL写成return,如果不写不会自动返回NULL
p = (PTree) malloc(sizeof(struct TreeNode));
p -> Data = Pre[0];
for(i=0;i<len;++i){
//在找根节点在中序遍历序列的哪个位置
if (Pre[0]==In[i]){
break;
}
}
//树本身定义就是递归定义,使用递归方式建树
p -> Left = create(Pre+1,In,i);
p -> Right = create(Pre+i+1,In+i+1,len-i-1);
return p;
}
int main(){
int N;
scanf("%d",&N);
int Pre[2*N],In[2*N],Post[2*N],command[2*N];
int PreNum=0,InNum=0;
int stack[2*N],top=0;
for(int i=0;i<2*N;++i){
//生成前序遍历序列
command[i]=input();
if(command[i]!=-1){
Pre[PreNum++] = command[i];
}
}
for(int i=0;i<2*N;++i){
//利用栈生成中序遍历序列
if(command[i]==-1){
In[InNum++]=stack[--top];
}
if(command[i]!=-1){
stack[top++]=command[i];
}
}
PostTraversal(create(Pre,In,N));
return 0;
}