二叉树的前序,中序,后序遍历

前序遍历:根左右
中序遍历:左根右
后序遍历:左右根

前序遍历

typedef struct node{

    char data;
    struct node *lchild,*rchild;

}BiTNode; 
//前序遍历 递归 
void PreOrder(BiTNode *p){

    if(p!=NULL){
        printf("%3c",p->data );
        PreOrder(p->lchild);
        PreOrder(p->rchild);
        
    } 
}

//非递归
void Preorder1(BiTNode *p){
    BiTNode *stack[MAXSIZE];
    int i=0;
    stack[0]=NULL;
    while(p!=NULL||i>0){
        if(p!=NULL){
            printf("%3c",p->data);
            stack[++i]=p;
            p=p->lchild;
            
        }
        else{
            p=stack[i--];
            p=p->rchild;
        }
    } 
}

中序遍历

//中序遍历 递归 
void InOrder(BiTNode *p){
    if(p!=NULL){
        InOrder(p->lchild);
        printf("%3c",p->data);
        InOrder(p->rchild);
    }
}
//非递归 
void Inorder1(BiTNode *p){
    BiTNode *stack[MAXSIZE];
    int i=0;
    stack[0]=NULL;
    while(i>=0){
        if(p!=NULL){
            stack[++i]=p;
            p=p->lchild;
        }
        else{
            p=stack[i--];
            printf("%3c",p->data);
            p=p->rchild;
        }
        if(p==NULL&&i==0)
            break;
    }
}

后序遍历

//后序遍历 递归 
void PostOrder(BiTNode *p){
    if(p!=NULL){
        PostOrder(p->lchild);
        PostOrder(p->rchild);
        printf("%3c",p->data);
    }
}
//非递归 
void Postorder1(BiTNode *p){
    BiTNode *stack[MAXSIZE];
    int b[MAXSIZE],i=0;
    stack[0]=NULL;
    do{
        if(p!=NULL){
            stack[++i]=p;
            b[i]=0;
            p=p->lchild;
        }
        else{
            p=stack[i--];
            if(b[i+1]==0){
                stack[++i]=p;
                b[i]=1;
                p=p->rchild;
            }
            else{
                printf("%3c",p->data);
                p=NULL;
            }
        }
        
    }while(p!=NULL||i>0);
}

你可能感兴趣的:(二叉树的前序,中序,后序遍历)