先序遍歴、中序遍歴、後続遍歴の非再帰的実現

2169 ワード

void PreOrderTraverse(BiTree T)//         
{  
      
    stack Stack;  
    if(!T)  
    {  
        printf("  !
"); 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 Stack;  
    if(!T)  
    {  
        printf("  !
"); 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 Stack;  
    if(!T)  
    {  
        printf("  !
"); 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(); } }