バイナリツリートラバーサル(非再帰的に)

プリアンブル非再帰的トラバーサル(スタック構造を借ります)
①ルートスタックに。
②文のスタック空間、トップ素子出力へのアクセス。
③バック実行②に、右サブツリーが空であるかどうかを判断し、左の部分木が空であるかどうかを決定します。
ボイドプレオーダー(BinTreeのBT)
{ 
    スタック <BinTree> astack。
    BinTreeNode * P; 
    astack.push(BT)。
    一方、(!astack.empty())
    { 
        P = astack.top()。
        astack.pop(); 
        coutの << p型>データ<< "  " ;
        もし(!P-> rightchild = NULL)
        { 
            astack.push(P - > rightchild)。
        } 
        であれば(P-> leftchild!= NULL)
        { 
            astack.push(P - >  leftchild)。
        }
    } 
}
非再帰的トラバーサル(スタック構造を借りて)ために:
まずルート・スタック
①まず、現在のノードにすべての左側のツリーノードを保存します。
②ツリーが空のままの場合、先頭の要素(一番左の部分木)出力ヴァルを得ます。
③右サブツリートップ要素へのアクセス(P = P->右)、①に戻って落ちます。
無効順序どおり(BinTree BT)
{ 
    スタック <BinTree> aStack; 
    BinTree P; 
    P = BT;
     IF(P == NULL)
    { 
        リターン; 
    } 
    astack.push(BT); 
    P = P-> leftchild;
     一方(P || !astack.empty())
    { 
        一方(P = NULL)!// NULLまでの深さの左のブランチに沿って
        { 
            astack.push(P); 
            P = P-> leftchild; 
        } 
        
        P = astack.top(); // 一つ一つをポップアップし、訪問
        astack.pop(); 
        COUT << P->データ<< "  " ; 
        P = P-> rightchild; // 右のブランチに、次の円、左深さの右ブランチ上
    } 
}
後順トラバーサル非再帰的(スタック構造を借ります):
①現在のノードが空でないかどうかを判断し、スタックが空でない場合、すべてのノードプッシュのルートノードの、左サブツリー。
②)(先頭の要素とポップを取得し、それは要素(すなわち「/」タイプのうち、最後のポップであるかどうか、左の部分木の何を最上位の要素を決定するために、この時間は、まだ右部分木トラバーサルの現在のトップの要素を表し、ので、再びスタックの現在のトップのルートノードの右サブツリー)、①を続け、満たされていない、それがNULLです。
ボイド後順(BinTree BT)
{ 
    BinTree P = BT、
    スタック <BinTree> aStack;
     IF(BT == NULL)
    { 
        リターン; 
    } 
    
    ながら(!= NULL || Pのastack.empty())
    { 
        ながら!(P = NULL)
        { 
            astack.push(P-); 
            P- = P-> P-leftchild> leftchild :? P-> rightchild; // 左の子が空でない場合、子供が左に移動したり、右の子に移動
        }
         // ここで私たちは、一番下に到達した 
        P = )(astack.topを、
        astack.pop(); 
        COUT << p型> <<データ"  " ; 
        
        IF - (astack.empty()&&(astack.top()> P leftchild - ==)!)// スタックが空ではない、とだけアクセスノードは子のままにすると
        、{ 
            P- = astack.topを() - > rightchild; // 右の子にシフトし、次の大きなサイクルは、このノードの下を探し始め
        }
         // 子供は子供が最後のプロセスに残ったことを示し、右のであれば
        、{ 
            P- ; = NULL // P-Fuが空であります、最初のサイクルの次のサイクルが返さ一つに対応する、大通過したように
        } 
    }     
}

おすすめ

転載: www.cnblogs.com/single-dont/p/11545226.html