プレリュード、ミディアム、およびポストオーダーの非回復的なトラバースでは、ポイントノードのポインターのみを保持する場合、いくつかの追加情報が必要ですスタックに保管してください。
ここには多くの方法があります。まず、スタックノードのデータ構造を定義します。
次のようにコードコードをコピーします。
typedef struct {node * p;} snode //ノードはバイナリツリーのノード構造です。
LastOrderTraverse(Bitree BT){
//最初に、ルートノードから開始し、左下に移動し、頭に移動し、パスの各ノードをスタックに入力します。
p = bt;
while(bt)
プッシュ(bt、0);
bt = bt.lchild;
}
//次に、サイクルボディを入力します
while(!stack.empty()){//スタックが空でない限り
sn = stack.gettop(); // snはスタックのトップノードです
//任意のノードnは、彼が左の子供を持っている限り、nがスタックに入った後、nの左子はスタックに従う必要があります(これはアルゴリズムの後半に反映されます)。スタック上部の要素がある場合、この要素には左の子供や左の子供にアクセスされていないことを確認できます。そのため、現時点では左の子供は気にしません。
//適切な子供にアクセスされた場合、または要素が適切な子供を持っていない場合、ポストシーケンシャルトラバーサルの定義はこの時点で移動できます。
if(!sn.p.rchild || sn.rvisited){{
p = pop();
(p)にアクセスしてください。
}
そうでなければ、//右の子供が存在し、rvisitedが0の場合、それは移動していない右の子供が以前に動かされていないことを意味します。
{{
//この時点で、右子のノードから最後まで左下に移動し、このパスのすべてのノードをスタックに入れなければなりません。
//もちろん、スタックに入る前にノードのrvisitedを1に設定します。右子のスタックは、その前に右の子供にアクセスすることを意味するためです(これは、観察から常に続くので、これはよく理解されています。訪問のためのスタックの要素)。要素がスタックの上部にある場合、適切な子供を訪問して渡す必要があるため、ここでRVisitedを1に設定できることがわかります。
sn.rvisited = 1;
//左下に進み、パスにすべての要素をスタックに入れます
p = sn.p.rchild;
while(p!= 0){
プッシュ(p、0);
p = p.lchild;
}
} //このサイクルは終了しました。
}
}