プレオーダー、インオーダー、およびポストオーダートラバーサル戦略を使用する場合
バイナリツリーのプレオーダー、インオーダー、ポストオーダーをどのような状況で使用するかを理解する前に、各トラバーサル戦略がどのように機能するかを正確に理解する必要があります。例として次のツリーを使用します。
ツリーのルートは7、左端のノードは0、右端のノードは10です。

事前注文トラバーサル:
概要:ルート(7)で始まり、右端のノード(10)で終わります。
トラバーサルシーケンス:7、1、0、3、2、5、4、6、9、8、10
インオーダートラバーサル:
概要:左端のノード(0)で始まり、右端のノード(10)で終わります。
トラバーサルシーケンス:0、1、2、3、4、5、6、7、8、9、10
注文後のトラバーサル:
概要:左端のノード(0)で始まり、ルート(7)で終わります。
トラバーサルシーケンス:0、2、4、6、5、3、1、8、10、9、7
プレオーダー、インオーダー、ポストオーダーのいずれを使用するのですか?
プログラマーが選択するトラバーサル戦略は、設計されているアルゴリズムの特定のニーズによって異なります。目標は速度です。したがって、必要なノードを最速で提供する戦略を選択してください。
葉を検査する前に根を探索する必要があることがわかっている場合は、すべての葉の前にすべての根に遭遇するため、 事前注文を選択します。
ノードの前にすべての葉を探索する必要があることがわかっている場合は、葉を探すために根を調べる時間を無駄にしないため、ポストオーダーを選択します。
ツリーがノードに固有のシーケンスを持っていることがわかっていて、ツリーを元のシーケンスにフラット化する場合は、順序どおりのトラバーサルを使用する必要があります。ツリーは、作成されたのと同じ方法で平坦化されます。プレオーダーまたはポストオーダートラバーサルは、ツリーを作成に使用されたシーケンスに巻き戻さない場合があります。
プレオーダー、インオーダー、ポストオーダー(C ++)の再帰的アルゴリズム:
struct Node{
int data;
Node *left, *right;
};
void preOrderPrint(Node *root)
{
print(root->name); //record root
if (root->left != NULL) preOrderPrint(root->left); //traverse left if exists
if (root->right != NULL) preOrderPrint(root->right);//traverse right if exists
}
void inOrderPrint(Node *root)
{
if (root.left != NULL) inOrderPrint(root->left); //traverse left if exists
print(root->name); //record root
if (root.right != NULL) inOrderPrint(root->right); //traverse right if exists
}
void postOrderPrint(Node *root)
{
if (root->left != NULL) postOrderPrint(root->left); //traverse left if exists
if (root->right != NULL) postOrderPrint(root->right);//traverse right if exists
print(root->name); //record root
}