前の記事では、再帰トラバーサルカレンダーアルゴリズム(バイナリツリーファーストルート(最初のシーケンス)トラバーサル)は、主にバイナリツリーの非再帰アルゴリズムについて説明しています。
最初のトラバーサルの非再帰アルゴリズムを要約します。
1)主にスタックの最初のノードを入力するには、スタックを入力してから、このノードにアクセスします
2)whil
3)ノードの適切な子、1)トラバースを続けると、現在のノードが終了し、トラバースの親ノードに転送されます1)
まず、このアイデアに準拠するアルゴリズムを見てください。
次のようにコードコードをコピーします。
int PreordertraversenonrcursiveEx(const bitree&t、int(*visitNode)(Telemtype Data))
{{
if(t == null)
{{
return -1;
}
bitnode *pbinode = t;
sqstack s;
initStack(&s);
push(&s、(selectype)t);
while(!isstackedy(s))
{{
while(pbinode)
{{
VisitNode(pbinode-> data);
if(pbinode!= t)
{{
push(&s、(selectype)pbinode);
}
pbinode = pbinode-> lchild;
}
if(pbinode == null)
{{
pop(&s、(selemtype*)&pbinode);
}
if(pbinode-> rchild == null)
{{
pop(&s、(selemtepe*)&pbinode);
}
pbinode = pbinode-> rchild;
}
0を返します。
}
注:1)スタック構造はここで使用されており、上記の構造の順に保存されているスタックを見ることができます
2)ここでノードを保存するとき、私が保存するのはポインターのアドレス、つまりノードのアドレスであり、ポインターがPOPで使用されます。 。
上記のアルゴリズムは実際に間違っています!なぜ? ここでは、期間中に無限のサイクルがありました。スタックがポップの後に空になっているが、まだ正しいツリーがあるため、これはあまり確認されていないため、後で説明しています左の子の木が空の場合、次のように:
次のようにコードコードをコピーします。
int preordertraversenonrcursive(const bitree&t、int(*visitnode)(テレメタイプデータ))
{{
if(t == null)
{{
return -1;
}
bitnode *pbinode = t;
sqstack s;
initStack(&s);
push(&s、(selectype)t);
while(!isstackedy(s))
{{
gettop(s、(selectype*)&pbinode);
while(pbinode)
{{
VisitNode(pbinode-> data);
pbinode = pbinode-> lchild;
push(&s、(selectype)pbinode);
}
if(pbinode == null)
{{
pop(&s、(selemtype*)&pbinode);
}
if(!isstackedy(s))
{{
pop(&s、(selemtype*)&pbinode);
pbinode = pbinode-> rchild;
push(&s、(selectype)pbinode);
}
}
0を返します。
}
これは、最初にルートノードを押し、次に左のサブツリーが空であるかどうかを判断し、空のスタックが空になっていない場合はスタックに押し込みます。右の子ノードに押してから、右木の左子が空であるかどうかを判断し、サイクルを続けます。
ここには2つの廃棄物があります。1つは空の子供のノードに押し込み、スタックに入ることです。
ここに戻り、最初にヌルノードがnullポインターまたは空の子に押し込まれていませんが、ここではスタックを判断するときに追加できると思いますnullはnullです。そのため、次のように、右のサブツリーツリーのノードを表示しない恥ずかしさがありません。
次のようにコードコードをコピーします。
//バイナリツリーを回復的に通過しない
int PreordertraversenonrcursiveEx(const Bitree&t、
int(*visitNode)(Telemtypeデータ))
{{
if(t == null)
{{
return -1;
}
bitnode *pbinode = t;
sqstack s;
initStack(&s);
push(&s、(selectype)t);
while(!isstackedy(s)|| pbinode)//メインの変更はこの文です
{{
while(pbinode)
{{
VisitNode(pbinode-> data);
if(pbinode!= t)
{{
push(&s、(selectype)pbinode);
}
pbinode = pbinode-> lchild;
}
if(pbinode == null)
{{
pop(&s、(selemtype*)&pbinode);
}
if(pbinode-> rchild == null)
{{
pop(&s、(selemtepe*)&pbinode);
}
pbinode = pbinode-> rchild;
}
0を返します。
}
ループが追加された後、テストケースはバイナリツリーに似ています。次のように、前のセクションでバイナリツリーをテストします。
この時点で、入力データはまだ12 34 0 0 78 0です。テスト結果は次のとおりです。
---ビットリー---
Bitreeノードデータを入力してください:
12
Bitreeノードデータを入力してください:
34
Bitreeノードデータを入力してください:
0
Bitreeノードデータを入力してください:
0
Bitreeノードデータを入力してください:
78
Bitreeノードデータを入力してください:
0
Bitreeノードデータを入力してください:
0
12 34 78
これはテストするのに十分ではありません、次のバイナリツリーを見てください
この時点で、入力データは次のようにする必要があります。123424 0 0 0 0 0 0 78 37 0 00。テスト結果は次のとおりです。
---ビットリー---
Bitreeノードデータを入力してください:
12
Bitreeノードデータを入力してください:
34
Bitreeノードデータを入力してください:
24
Bitreeノードデータを入力してください:
0
Bitreeノードデータを入力してください:
0
Bitreeノードデータを入力してください:
50
Bitreeノードデータを入力してください:
0
Bitreeノードデータを入力してください:
0
Bitreeノードデータを入力してください:
78
Bitreeノードデータを入力してください:
37
Bitreeノードデータを入力してください:
0
Bitreeノードデータを入力してください:
0
Bitreeノードデータを入力してください:
0
12 34 24 50 78 37
さらに、これらのアルゴリズムが序文になりたい場合は、上記のアルゴリズムの訪問を削除するだけであることが正しいことがわかります。 、そしてそれを追加して適切な位置に