【数据结构基础】前序、中序、后序线索化二叉树(非递归实现)

前言:
花了整整一天时间写完了二叉树的线索化的递归实现和非递归实现。目的有两个:
一是 熟悉树的递归和非递归遍历。
二是 琢磨琢磨递归方法。
在写的过程中发现网上很少有线索二叉树的前序、中序、中序 递归 及非递归的算法的完整实现。

//非递归前序  
#include<stdio.h>
#include<stdlib.h>
#define bool int
typedef struct TreeNode{
    char data;
    struct TreeNode *lchild,*rchild;
    int ltag,rtag;
}Tree,*BTree;
typedef struct Stack{
    BTree data;
    struct Stack *next;
}Stack,*PStack;
typedef struct{
    PStack top;
}LinkStack,*PLinkStack;
//初始化栈 
PLinkStack Init_Stack(void){
    PLinkStack S;
    S=(PLinkStack)malloc(sizeof(LinkStack));
    if(S){
        S->top=NULL;     
    }
    return S; 
}
//入栈
void Push_Stack(PLinkStack S,BTree t){
    PStack node;
    node=(PStack)malloc(sizeof(Stack));
    node->data=t;
    node->next=S->top;
    S->top=node; 
}
//判空
bool Empty_Stack(PLinkStack S){
    if(S->top){
        return 0;
    }else{
        return 1;
    }
} 
//出栈
PStack Pop_Stack(PLinkStack S){
    PStack q;
    q=S->top;
    if(!Empty_Stack(S)){
        S->top=S->top->next;

    }
    return q;
}
//取前序元素
PStack Get_Top_Stack(PLinkStack S){
    return S->top;
} 
//销毁栈
void Destroy_Stack(PLinkStack S){
    PStack q;
    if(S->top){
        q=S->top;
        S->top=S->top->next; 
    }
    free(q);
} 
BTree Build_Tree(){
    BTree T;
    char ch;
    scanf("%c",&ch);
    if(ch=='#'){
        T=NULL; 
    }else{
        T=(BTree)malloc(sizeof(Tree));
        T->data=ch;
        T->ltag=0;
        T->rtag=0; 
        T->lchild=Build_Tree();
        T->rchild=Build_Tree();
    }
    return T;
}
//非递归先序线索化二叉树 
//void NonRecursion_Pre_Thread(BTree T,BTree *pre){
//  PLinkStack S;
//  S=Init_Stack();
//  while(T || !Empty_Stack(S)){
//      if(T && T->ltag==0){
//      printf("%c ",T->data);
//      if(*pre && (*pre)->rtag==1){
//          (*pre)->rchild=T;
//          (*pre)->ltag=1;
//      }
//      if(T->lchild==NULL){
//          T->lchild=*pre;
//          (*pre)->ltag=1;
//          T->ltag=1; 
//      }
//      if(T->rchild==NULL){
//          T->rtag=1;
//      }
//      Push_Stack(S,T);
//      *pre=T;
//      T=T->lchild; 
//      }else{
//          if(!Empty_Stack(S)){
//              T=Pop_Stack(S)->data; 
//              T=T->rchild; 
//          }else{
//              exit(-1);
//          }    
//      }
//  }   
//}
//void NonRecursion_In_Thread(BTree T,BTree *pre){
//  PLinkStack S;
//  S=Init_Stack(); 
//  while(T || !Empty_Stack(S)){
//      if(T){
//          Push_Stack(S,T);
//          T=T->lchild;    
//      }else{
//          T=Pop_Stack(S)->data;
//          printf("%c ",T->data);
//          if(T->lchild==NULL){
//              T->lchild=*pre;
//              T->ltag=1;
//          }
//          if(T->rchild==NULL){
//              T->rtag=1; 
//          }
//          if(*pre && (*pre)->rtag==1){
//              (*pre)->rchild=T;
//          }
//          *pre=T; 
//          T=T->rchild;
//      }
//  }
//}
void NonRecursion_Post_Thread(BTree T,BTree *pre){
    PLinkStack S1,S2;
    S1=Init_Stack();
    S2=Init_Stack();
    while(T || !Empty_Stack(S2)){
        if(T){
            Push_Stack(S1,T);
            Push_Stack(S2,T);
            T=T->rchild;
        }else{
            T=Pop_Stack(S2)->data;
            T=T->lchild;
        }
    } 
    while(!Empty_Stack(S1)){
        T=Pop_Stack(S1)->data; 
        if(T->lchild==NULL){
            T->lchild=*pre;
            T->ltag=1;
        }
        if(T->rchild==NULL){
            T->rtag=1;
        } 
        if(*pre &&  (*pre)->rtag==1){
            (*pre)->rchild=T;
        } 
        *pre=T;
        printf("%c ",T->data);
    } 
} 
int main(void){
    BTree T,p=NULL;
    T=Build_Tree();
//  NonRecursion_Pre_Thread(T,&p);
//  NonRecursion_In_Thread(T,&p);
    NonRecursion_Post_Thread(T,&p);
    return 0;
} 

你可能感兴趣的:(数据结构和算法)