先序遍历、中序遍历、后续遍历的非递归实现

2017-09-18  本文已影响0人  Temple_Li
void PreOrderTraverse(BiTree T)//非递归先序遍历  
{  
      
    stack<BiTree> Stack;  
    if(!T)  
    {  
        printf("空树!\n"); 
        return;  
    }  
    while(T || !Stack.empty())  
    {  
        while(T)  
        {
            Stack.push(T);
            printf("%c",T->data); 
            T=T->lchild; 
        }
        T=Stack.top(); 
        Stack.pop(); 
         T=T->rchild;  
    }                                                                                                                                     
}  
void InOrderTraverse(BiTree T)//非递归中序遍历  
{  
      
    stack<BiTree> Stack;  
    if(!T)  
    {  
        printf("空树!\n");  
        return;  
    }  
      
    while(T || !Stack.empty())  
    {  
        while(T)  
        {  
            Stack.push(T);  
            T=T->lchild;  
        }  
        T=Stack.top();  
        Stack.pop();  
        printf("%c",T->data);  
        T=T->rchild;  
    }                                                                                                                                     
} 
void PostOrderTraverse(BiTree T)//非递归后序遍历,用一个标记标记右子树是否访问过  
{  
    int flag[20];  
    stack<BiTree> Stack;  
    if(!T)  
    {  
        printf("空树!\n");  
        return;  
    }  
    while(T)  
    {  
        Stack.push(T);  
        flag[Stack.size()]=0;  
        T=T->lchild;  
    }  
    while(!Stack.empty())  
    {  
        T=Stack.top();            
        while(T->rchild && flag[Stack.size()]==0)  
        {  
            flag[Stack.size()]=1;  
            T=T->rchild;  
            while(T)  
            {  
                Stack.push(T);  
                flag[Stack.size()]=0;  
                T=T->lchild;  
            }  
        }  
        T=Stack.top();  
        printf("%c",T->data);  
        Stack.pop();  
    }                                                                                                                                     
} 
上一篇 下一篇

猜你喜欢

热点阅读