ウィキペディアで次の写真を見つけました。
写真の下のテキストによると、順序は次のとおりです。A、B、C、D、E、F、G、H、I
AFの順番はわかりますが、最後の3つのノードの順番がわかりません。H、I、Gのはずじゃないの?2回目の遭遇で内部ノードをリストし、1回目に去ることになっていたと思いましたか?
編集: 写真の木が二分木ではなく一般的な木である場合、私の注文は正しいでしょうか? (そのため、G には、右ノードとヌル左ノードではなく、ノードが 1 つしかありません。)
ウィキペディアで次の写真を見つけました。
写真の下のテキストによると、順序は次のとおりです。A、B、C、D、E、F、G、H、I
AFの順番はわかりますが、最後の3つのノードの順番がわかりません。H、I、Gのはずじゃないの?2回目の遭遇で内部ノードをリストし、1回目に去ることになっていたと思いましたか?
編集: 写真の木が二分木ではなく一般的な木である場合、私の注文は正しいでしょうか? (そのため、G には、右ノードとヌル左ノードではなく、ノードが 1 つしかありません。)
残念ながらウィキペディアは正しいです!
詳細なアルゴリズム
inorder_traversal(node)
{
if(node!=NULL)
{
inorder_traversas(node->left);
print(node->data); //you overlooked this statement on reaching G
inorder_traversal(node->right);
}
}
F から G に到達すると、NULL である G の左の子に入ろうとしました (つまりinorder_traversal(node->left)
、アルゴリズムがチェックし、G の左の子が NULL であるため、ステートメントは失敗しましたif(node!=NULL)
。その後、再び G に戻ります。その後、あなたは そこに Gを出力するprintステートメント - その print ステートメントを見落とした後、 node->right が NULL かどうかをチェックする次のステートメントにジャンプしました - null ではないことがわかりました (I に移動しました)。I を直接印刷し、その左の子をチェックしました。左の子Hがそこにあったので、それを印刷してからI に戻りました- 親、その右の子は null でした。したがって、ウィキペディアは正しいです。
inorder traversal をテストするためのヒント : 入力データとして整数 (または通常は数値) を受け入れるバイナリ ツリーを作成します。inorder 方式でトラバースすると、数字は昇順で出力されます。
ウィキペディアで言及されている答えは正しいです。AFわかるって言ってたから、Gからもらおう。
順序通りのトラバーサルは、左 - 親 - 右のシリーズに従います。したがって、F がトラバースされ、アルゴリズムが F の右の子に移動すると、最初に G に遭遇し、次に G の左の子を見つけようとします。G の左の子は null であるため、何も出力されず、親に移動します。 、つまり G; したがって、G が印刷されます。ここで、G の右の子である I に進みます。次に、I の左の子である H を見つけて出力します。次に、親である I に戻り、それを出力します。次に、I の右側にトラバースし、それが null であることを検出します。すべてのノードがトラバースされたので、アルゴリズムは終了します。したがって、次数は GHI です。
順序通りのトラバーサルは次のように機能します。
1- print the left sub tree.
2- print the root.
3- print the right sub tree
あなたが提供した例では:
1- the left sub-tree of `G` is empty, so we do not print any thing.
2- we print the node `G`.
3- finally we print the right sub-tree of `G`