アルゴリズムとデータ構造のクラスでは、Haskell でスプレイ ツリーを実装するタスクを課されました。スプレー操作の私のアルゴリズムは次のとおりです。
- 表示するノードがルートの場合、変更されていないツリーが返されます。
- 表示されるノードがルートから 1 レベルの場合、ジグ操作が実行され、結果のツリーが返されます。
- 展開するノードがルートから 2 レベル以上の場合、そのノードから始まるサブツリーを展開した結果に対してジグジグまたはジグザグ操作が実行され、結果のツリーが返されます。
これは私の先生によれば有効です。ただし、ウィキペディアのスプレイ ツリーの説明では、ジグ ステップは「スプレイ操作の最後のステップとしてのみ実行される」と述べていますが、私のアルゴリズムではスプレイ操作の最初のステップです。
ジグ操作を最初ではなく最後に実行するスプレイ ツリーを実装したいのですが、どのように実行するのが最適かわかりません。ジグ操作を実行する必要があるかどうかを判断する前に、展開するノードをどのように見つける必要があるかを考えると、そのようなアルゴリズムはより複雑になると思われます。
Haskell (または他の関数型言語) でこれを実装するにはどうすればよいですか?
例
この例では、値 4 を検索し、それをツリーの一番上に表示するように求めています。
私のアルゴリズム(最初のステップとしてジグ)
1 1 4 \ \ / 2 ジグ 2 ジグジグ 2 \ --> \ ------> / \ 3 4 1 3 \ / 4 3
ウィキペディアのアルゴリズム (最後のステップとして zig)
1 1 4 \ \ / 2 ジグジグ 4 ジグ 1 \ ------> / --> \ 3 3 3 \ / / 4 2 2
どちらのツリーも有効ですが、構造が異なります。2 つ目は関数型言語、できれば Haskell で実装したいと考えています。