事前注文トラバーサル のタイプとして定義されます ツリートラバース これは、Root-Left-Right ポリシーに従います。
- サブツリーのルート ノードが最初にアクセスされます。
- 次に、左側のサブツリーが走査されます。
- 最後に、右側のサブツリーをたどります。

事前注文トラバーサル
バイナリツリーのプリオーダートラバーサルアルゴリズム
プリオーダー トラバーサルのアルゴリズムは次のとおりです。
予約注文(ルート):
- root != NULLになるまでステップ2から4を実行します。
- ルート -> データの書き込み
- 予約注文 (ルート -> 左)
- 予約注文 (ルート -> 右)
- エンドループ
バイナリ ツリーの事前注文トラバーサルはどのように機能しますか?
次のツリーを考えてみましょう。

二分木の例
このバイナリ ツリーで事前順序走査を実行すると、走査は次のようになります。
ステップ1: 最初にルート、つまりノード 1 にアクセスします。
ノード 1 が訪問されました
ステップ2: この後、左側のサブツリーをトラバースします。ここで、左側のサブツリーのルート、つまりノード 2 が訪問されます。
JavaコアJavaノード 2 が訪問されました
ステップ 3: 再び、ノード 2 の左側のサブツリーがたどられ、そのサブツリーのルート、つまりノード 4 が訪問されます。
ノード 4 が訪問されました
ステップ 4: 4 のサブツリーは存在しないため、ノード 2 の左側のサブツリーが参照されます。したがって、ノード 2 の右のサブツリーがトラバースされ、そのサブツリーのルート、つまりノード 5 が訪問されます。
ノード 5 が訪問されました
ステップ5: ノード 1 の左側のサブツリーが参照されます。したがって、ノード 1 の右側のサブツリーがトラバースされ、ルート ノード、つまりノード 3 が訪問されます。
ノード 3 が訪問されました
ステップ6: ノード 3 には左側のサブツリーがありません。したがって、右のサブツリーをたどって、サブツリーのルート、つまりノード 6 にアクセスします。その後、まだ通過していないノードはありません。それで縦走は終了です。
完全なツリーを訪問する
したがって、ノードのトラバース順序は次のようになります。 1 -> 2 -> 4 -> 5 -> 3 -> 6 。
バイナリツリーのプリオーダートラバーサルを実装するプログラム
以下は、事前注文トラバーサルのコード実装です。
C++ // C++ program for preorder traversals #include using namespace std; // Structure of a Binary Tree Node struct Node { int data; struct Node *left, *right; Node(int v) { data = v; left = right = NULL; } }; // Function to print preorder traversal void printPreorder(struct Node* node) { if (node == NULL) return; // Deal with the node cout << node->データ<< ' '; // Recur on left subtree printPreorder(node->左); // 右のサブツリーで繰り返します printPreorder(node->right); } // ドライバー コード int main() { struct Node* root = new Node(1); ルート->左 = 新しいノード(2); ルート->右 = 新しいノード(3); ルート->左->左 = 新しいノード(4); ルート->左->右 = 新しいノード(5); ルート->右->右 = 新しいノード(6); // 関数呼び出し cout<< 'Preorder traversal of binary tree is:
'; printPreorder(root); return 0; }> ジャワ // Java program for preorder traversals class Node { int data; Node left, right; public Node(int item) { data = item; left = right = null; } } class BinaryTree { Node root; BinaryTree() { root = null; } // Function to print preorder traversal void printPreorder(Node node) { if (node == null) return; // Deal with the node System.out.print(node.data + ' '); // Recur on left subtree printPreorder(node.left); // Recur on right subtree printPreorder(node.right); } // Driver code public static void main(String[] args) { BinaryTree tree = new BinaryTree(); // Constructing the binary tree tree.root = new Node(1); tree.root.left = new Node(2); tree.root.right = new Node(3); tree.root.left.left = new Node(4); tree.root.left.right = new Node(5); tree.root.right.right = new Node(6); // Function call System.out.println('Preorder traversal of binary tree is: '); tree.printPreorder(tree.root); } }> Python3 # Python program for preorder traversals # Structure of a Binary Tree Node class Node: def __init__(self, v): self.data = v self.left = None self.right = None # Function to print preorder traversal def printPreorder(node): if node is None: return # Deal with the node print(node.data, end=' ') # Recur on left subtree printPreorder(node.left) # Recur on right subtree printPreorder(node.right) # Driver code if __name__ == '__main__': root = Node(1) root.left = Node(2) root.right = Node(3) root.left.left = Node(4) root.left.right = Node(5) root.right.right = Node(6) # Function call print('Preorder traversal of binary tree is:') printPreorder(root)> C# // C# program for preorder traversals using System; // Structure of a Binary Tree Node public class Node { public int data; public Node left, right; public Node(int v) { data = v; left = right = null; } } // Class to print preorder traversal public class BinaryTree { // Function to print preorder traversal public static void printPreorder(Node node) { if (node == null) return; // Deal with the node Console.Write(node.data + ' '); // Recur on left subtree printPreorder(node.left); // Recur on right subtree printPreorder(node.right); } // Driver code public static void Main() { Node root = new Node(1); root.left = new Node(2); root.right = new Node(3); root.left.left = new Node(4); root.left.right = new Node(5); root.right.right = new Node(6); // Function call Console.WriteLine( 'Preorder traversal of binary tree is: '); printPreorder(root); } } // This code is contributed by Susobhan Akhuli> JavaScript // Structure of a Binary Tree Node class Node { constructor(v) { this.data = v; this.left = null; this.right = null; } } // Function to print preorder traversal function printPreorder(node) { if (node === null) { return; } // Deal with the node console.log(node.data); // Recur on left subtree printPreorder(node.left); // Recur on right subtree printPreorder(node.right); } // Driver code function main() { const root = new Node(1); root.left = new Node(2); root.right = new Node(3); root.left.left = new Node(4); root.left.right = new Node(5); root.right.right = new Node(6); // Function call console.log('Preorder traversal of binary tree is:'); printPreorder(root); } main();> 出力
Preorder traversal of binary tree is: 1 2 4 5 3 6>
説明:

プリオーダートラバーサルの仕組み
複雑さの分析:
時間計算量: O(N) ここで、N はノードの総数です。すべてのノードを少なくとも 1 回通過するためです。
補助スペース:
- ○(1) 再帰スタックスペースが考慮されていない場合。
- さもないと、 おお) ここで、h は木の高さです
- 最悪の場合、 h と同じにすることができます N (斜木の場合)
- 最良の場合、 h と同じにすることができます 落ち着いた (ツリーが完全なツリーの場合)
事前注文トラバーサルの使用例:
事前注文トラバーサルの使用例には次のようなものがあります。
- これは、ツリーのコピーを作成するためによく使用されます。
- 式ツリーからプレフィックス式を取得することも便利です。
関連記事:
Androidで隠しアプリを開く方法
- ツリートラバーサルの種類
- 反復的な事前注文トラバーサル
- 指定された配列が BST の事前順序トラバーサルを表現できるかどうかを確認する
- 順および事後走査からの事前注文
- 二分木の事前順序走査で n 番目のノードを見つける
- N 分木の事前順序走査




