Python-ツリートラバーサルアルゴリズム

トラバーサルは、ツリーのすべてのノードにアクセスするプロセスであり、それらの値も出力する場合があります。すべてのノードはエッジ(リンク)を介して接続されているため、常にルート(ヘッド)ノードから開始します。つまり、ツリー内のノードにランダムにアクセスすることはできません。ツリーをトラバースするために使用する3つの方法があります-

  • インオーダートラバーサル
  • トラバーサルの事前注文
  • 注文後のトラバーサル

インオーダートラバーサル

このトラバーサル方法では、最初に左側のサブツリーにアクセスし、次にルートにアクセスし、次に右側のサブツリーにアクセスします。すべてのノードがサブツリー自体を表す場合があることを常に覚えておく必要があります。

以下のPythonプログラムでは、Nodeクラスを使用して、ルートノードと左右のノードのプレースホルダーを作成します。次に、ツリーにデータを追加するための挿入関数を作成します。最後に、Inorderトラバーサルロジックは、空のリストを作成し、最初に左側のノードを追加し、次にルートまたは親ノードを追加することによって実装されます。最後に、左側のノードが追加され、インオーダートラバーサルが完了します。このプロセスは、すべてのノードがトラバースされるまで、サブツリーごとに繰り返されることに注意してください。

class Node:

    def __init__(self, data):

        self.left = None
        self.right = None
        self.data = data
# Insert Node
    def insert(self, data):

        if self.data:
            if data < self.data:
                if self.left is None:
                    self.left = Node(data)
                else:
                    self.left.insert(data)
            elif data > self.data:
                if self.right is None:
                    self.right = Node(data)
                else:
                    self.right.insert(data)
        else:
            self.data = data

# Print the Tree
    def PrintTree(self):
        if self.left:
            self.left.PrintTree()
        print( self.data),
        if self.right:
            self.right.PrintTree()

# Inorder traversal
# Left -> Root -> Right
    def inorderTraversal(self, root):
        res = []
        if root:
            res = self.inorderTraversal(root.left)
            res.append(root.data)
            res = res + self.inorderTraversal(root.right)
        return res

root = Node(27)
root.insert(14)
root.insert(35)
root.insert(10)
root.insert(19)
root.insert(31)
root.insert(42)
print(root.inorderTraversal(root))

上記のコードを実行すると、次の結果が得られます。

[10, 14, 19, 27, 31, 35, 42]

トラバーサルの事前注文

このトラバーサル方法では、最初にルートノードにアクセスし、次に左側のサブツリーにアクセスし、最後に右側のサブツリーにアクセスします。

以下のPythonプログラムでは、Nodeクラスを使用して、ルートノードと左右のノードのプレースホルダーを作成します。次に、ツリーにデータを追加するための挿入関数を作成します。最後に、プレオーダートラバーサルロジックは、空のリストを作成し、最初にルートノードを追加し、次に左側のノードを追加することによって実装されます。最後に、適切なノードが追加され、事前注文トラバーサルが完了します。このプロセスは、すべてのノードがトラバースされるまで、サブツリーごとに繰り返されることに注意してください。

class Node:

    def __init__(self, data):

        self.left = None
        self.right = None
        self.data = data
# Insert Node
    def insert(self, data):

        if self.data:
            if data < self.data:
                if self.left is None:
                    self.left = Node(data)
                else:
                    self.left.insert(data)
            elif data > self.data:
                if self.right is None:
                    self.right = Node(data)
                else:
                    self.right.insert(data)
        else:
            self.data = data

# Print the Tree
    def PrintTree(self):
        if self.left:
            self.left.PrintTree()
        print( self.data),
        if self.right:
            self.right.PrintTree()

# Preorder traversal
# Root -> Left ->Right
    def PreorderTraversal(self, root):
        res = []
        if root:
            res.append(root.data)
            res = res + self.PreorderTraversal(root.left)
            res = res + self.PreorderTraversal(root.right)
        return res

root = Node(27)
root.insert(14)
root.insert(35)
root.insert(10)
root.insert(19)
root.insert(31)
root.insert(42)
print(root.PreorderTraversal(root))

上記のコードを実行すると、次の結果が得られます。

[27, 14, 10, 19, 35, 31, 42]

注文後のトラバーサル

このトラバーサル方法では、ルートノードが最後にアクセスされるため、この名前が付けられます。最初に左側のサブツリーをトラバースし、次に右側のサブツリーをトラバースし、最後にルートノードをトラバースします。

以下のPythonプログラムでは、Nodeクラスを使用して、ルートノードと左右のノードのプレースホルダーを作成します。次に、ツリーにデータを追加するための挿入関数を作成します。最後に、ポストオーダートラバーサルロジックは、空のリストを作成し、最初に左側のノードを追加し、次に右側のノードを追加することによって実装されます。最後に、ルートまたは親ノードが追加され、注文後のトラバーサルが完了します。このプロセスは、すべてのノードがトラバースされるまで、サブツリーごとに繰り返されることに注意してください。

class Node:

    def __init__(self, data):

        self.left = None
        self.right = None
        self.data = data
# Insert Node
    def insert(self, data):

        if self.data:
            if data < self.data:
                if self.left is None:
                    self.left = Node(data)
                else:
                    self.left.insert(data)
            elif data > self.data:
                if self.right is None:
                    self.right = Node(data)
                else:
                    self.right.insert(data)
        else:
            self.data = data

# Print the Tree
    def PrintTree(self):
        if self.left:
            self.left.PrintTree()
        print( self.data),
        if self.right:
            self.right.PrintTree()

# Postorder traversal
# Left ->Right -> Root
    def PostorderTraversal(self, root):
        res = []
        if root:
            res = self.PostorderTraversal(root.left)
            res = res + self.PostorderTraversal(root.right)
            res.append(root.data)
        return res

root = Node(27)
root.insert(14)
root.insert(35)
root.insert(10)
root.insert(19)
root.insert(31)
root.insert(42)
print(root.PostorderTraversal(root))

上記のコードを実行すると、次の結果が得られます。

[10, 19, 14, 31, 42, 35, 27]