Morrisのトラバーサル(Morris Traversal):効率的な二分木の走査方法


Morrisのトラバーサルのアルゴリズムは次のようになります:

  1. 現在のノードをcurrentとして初期化する。
  2. currentがnullでない限り以下の手順を繰り返す: a. currentの左の子ノードをleftとして初期化する。 b. leftがnullでない場合、currentと同じ部分木の最右のノードを見つける。
    • 最右のノードは、leftを根とする部分木で最も右側にあるノードです。
    • このノードの右の子ノードが現在のcurrentであるため、このノードの右の子ノードをnullに設定します。 c. leftがnullの場合、currentを訪れて適切な処理を行います。 d. currentをcurrentの右の子ノードに更新します。

このアルゴリズムを使用すると、二分木をインオーダー(中間順)に走査することができます。走査の順序は、左の部分木、現在のノード、右の部分木の順になります。

以下に、MorrisのトラバーサルのPythonコード例を示します:

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
def morris_traversal(root):
    current = root
    while current:
        if current.left is None:
            # 左の子ノードがない場合、現在のノードを訪れて適切な処理を行う
            print(current.val)  # 例えば、ノードの値を表示するなどの処理を行う
            current = current.right
        else:
            # 左の子ノードがある場合、最右のノードを見つける
            predecessor = current.left
            while predecessor.right and predecessor.right != current:
                predecessor = predecessor.right
            if predecessor.right is None:
                # 最右のノードがnullの場合、現在のノードの右の子ノードを最右のノードに設定し、左の子ノードに移動する
                predecessor.right = current
                current = current.left
            else:
                # 最右のノードがnullでない場合、最右のノードをnullに設定して、現在のノードを訪れて適切な処理を行う
                predecessor.right = None
                print(current.val)  # 例えば、ノードの値を表示するなどの処理を行う
                current = current.right
# 二分木の作成
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
# Morrisのトラバーサルを実行
morris_traversal(root)

このコード例では、Morrisのトラバーサルを使用して二分木を走査し、ノードの値を表示する処理を行っています。あなたの具体的な要件に応じて、このコードを変更して利用することができます。

以上が、Morrisのトラバーサルに関する解説とコード例です。これにより、効率的な二分木の走査が可能になります。