MOOC Zhejiang University Data Structure-03-Tree 3 Tree Traversals Again

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;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43919570/article/details/105137478
Recomendado
Clasificación