print $ merge (inorder treeA) (inorder treeB)
どうしたの?
(注意してください、上記は実際にタスクを実行して実行する実際の Haskell コードです)。inorder
再帰で実装するのは簡単です。 merge
ほぼ標準的な機能で、2 つの引数の順序付き (非減少) リストをマージし、順序付き出力リストを生成し、重複を保持します。
遅延評価とガベージ コレクションのため、リストは実際には作成されません。生成された要素はツリーごとに最大 1 つ保持され、次の要素が生成されると破棄されます。つまり、トラバーサルのイテレータが作成されます (それぞれが独自の内部状態を持つ)。 )。
これが解決策yield
です(言語が上記、または同等のメカニズム、または制御スタックの奥深くにある2つのコンテキストをそれぞれ切り替えることができるSchemeの明示的な継続をサポートしていない場合(したがって、「2つの再帰」を並行して行うことができます。上記のように)):
彼らは時間の複雑さについて何も言わないので、最初のツリーの各ノードに対して、最初のツリーを再帰的previous
にトラバースし、2 番目のツリーを新たにトラバースすることができます。したがって、最初のツリーに 2 つの連続する値があり、それらの間に 2 番目のツリーのすべての値を出力します。最初のツリーからの値の新しいペアごとに、2 番目のツリーの上部から再開して、再帰的なトラバーサルを新たに行います。