データ構造:ツリーの前順序、中順序、および後順序の遍歴の非再帰的表現


ツリーの遍歴方法
再帰形式の前序,中序,後序遍歴についてはここでは言わないが,ここでは主に非再帰形式のやり方を紹介し,二叉木のBFS階層遍歴についてはここでは紹介せず,直接キューを用いて行えばよい.
ぜんじゅんかん遍歴
前シーケンスループの非再帰形式は簡単で,直接stack方式で関連ノードループを格納すればよい.
疑似コードは次のとおりです.
  stack   ,
curr = root
while(true)
{
    while(curr!=null)
    {
        cout<<curr->value<<endl;
        stack.push(curr);
        curr = curr->left;
    }

    if(stack.empty())
        break;
    else
    {
        top = stack.top();
        stack.pop();    
        curr = top->right;
    }
}

ちゅうかんじゅんかん遍歴
疑似コードは次のとおりです.
  stack   ,
curr = root
while(true)
{
    while(curr!=null)
    {
        stack.push(curr);
        curr = curr->left;
    }

    if(stack.empty())
        break;
    else
    {
        top = stack.top();
        cout<<top->value<<endl;
        stack.pop();    
        curr = top->right;
    }
}

あとじゅんかん遍歴
ルートノードは、左の子供と右の子供がアクセスしてからアクセスできることを保証するため、いずれかのノードPについては、先にスタックに入れます.Pに左の子と右の子が存在しない場合は、直接アクセスできます.あるいはPには左または右の子が存在するが,左および右の子が既に訪問されている場合,同様にノードに直接アクセスすることができる.上記の2つ以外の場合、Pの右の子と左の子を順番にスタックに入れることで、スタックトップ要素を取るたびに左の子が右の子の前に訪問され、左の子と右の子がルートノードの前に訪問されることを保証します.
    stack;
    BinTree *cur = root;                      //     
    BinTree *pre = NULL;                 //         
    stack.push(root);
    while(!s.empty())
    {
        cur = s.top();
        if((cur->left==NULL&&cur->right==NULL)||
           (pre!=NULL&&(pre==cur->left||pre==cur->right)))
        {
            cout<<cur->data<<" ";  //                         
              s.pop();
            pre=cur; 
        }
        else
        {
            if(cur->right!=NULL)
                s.push(cur->right);
            if(cur->left!=NULL)    
                s.push(cur->left);
        }
    }