なぜ反復的な中間順序走査が重要なのでしょうか?それは、二分木の要素をソートされた順序で取得するための効果的な方法だからです。また、二分木の要素を順番に処理するためにも役立ちます。
以下に、反復的な中間順序走査を実装する簡単でシンプルな方法と、いくつかのコード例を示します。
方法:
-
スタックを使用する方法:
- スタックを用意し、最初に二分木のルートノードをスタックにプッシュします。
- スタックが空になるまで、以下の手順を繰り返します:
- スタックのトップからノードをポップし、そのノードを訪れます。
- ノードの右子ノードがあれば、右子ノードをスタックにプッシュします。
- ノードの左子ノードがあれば、左子ノードをスタックにプッシュします。
-
Morrisの反復的な中間順序走査:
- Morrisのアルゴリズムは、追加の空間を使用せずに中間順序走査を行う方法です。
- ノードを現在のノードとして初期化します。
- 現在のノードがNULLでない限り、以下の手順を繰り返します:
- 現在のノードの左子ノードがNULLであるかチェックします。
- NULLであれば、現在のノードを訪れてから、現在のノードを右子ノードに進めます。
- NULLでなければ、現在のノードの左部分木の最右のノードを見つけます。
- 最右のノードの右リンクがNULLであるかチェックします。
- NULLであれば、最右のノードの右リンクを現在のノードに設定し、現在のノードを左子ノードに進めます。
- NULLでなければ、最右のノードの右リンクをNULLに戻し、現在のノードを訪れてから、現在のノードを右子ノードに進めます。
コード例:
- スタックを使用する方法のコード例:
def iterative_inorder(root):
stack = []
current = root
while stack or current:
if current:
stack.append(current)
current = current.left
else:
current = stack.pop()
print(current.data)
current = current.right
- Morrisの反復的な中間順序走査のコード例:
def morris_inorder(root):
current = root
while current:
if current.left is None:
print(current.data)
current = current.right
else:
pre = current.left
while pre.right and pre.right != current:
pre = pre.right
if pre.right is None:
pre.right = current
current = current.left
else:
pre.right = None
print(current.data)
current = current.right
以上が、反復的な中間順序走査の原因、方法、およびコード例についてのブログ投稿の内容です。
反復的な中間順序走査は、二分木のノードを中間順序で訪れる方法です。この方法を使用すると、二分木のノードを左部分木、ノード自体、右部分木の順で訪れることができます。
なぜ反復的な中間順序走査が重要なのでしょうか?それは、二分木の要素をソートされた順序で取得するための効果的な方法だからです。また、二分木の要素を順番に処理するためにも役立ちます。
反復的な中間順序走査を実装する方法として、スタックを使用する方法とMorrisのアルゴリズムを紹介しました。
スタックを使用する方法では、スタックを用意し、最初に二分木のルートノードをスタックにプッシュします。その後、スタックが空になるまで、スタックのトップからノードをポップし、そのノードを訪れます。ノードの右子ノードがあればスタックにプッシュし、左子ノードがあればスタックにプッシュします。
Morrisのアルゴリズムでは、追加の空間を使用せずに中間順序走査を行います。具体的な手順については、上記の回答を参照してください。
また、各方法のコード例も提供しました。スタックを使用する方法とMorrisのアルゴリズムのコード例を掲載しましたので、それを参考にして実装してみてください。
以上が、反復的な中間順序走査の原因、方法、およびコード例についてのブログ投稿の内容です。