ツリー検索と置換アルゴリズムのコーディングに問題があります。入力ツリーには、任意にネストされたデータ項目が含まれます。たとえば、tree = (1 (2 3 (4 (5)) 6)) のように、1 がルートで、下の各レベルは括弧で囲まれています。したがって、1 はレベル #1 です。2、3、4、6 はレベル #2 (1 未満)、5 はレベル #3 (4 未満) です。ツリー全体は、任意のリストの car が常にデータ項目であり、その後に他のデータ項目またはサブツリーが続くように構造化されています。問題は、入力項目に一致するツリー内のデータ項目 (私の特定のケースでは #'equal) を見つけ、既存の古い項目を特定の新しいサブツリーに置き換えることです。したがって、ツリーは置換ごとに成長します。ただし、検索はツリー内でトップダウンに進み、最初に見つかったそのような olditem のみを交換してから終了する必要があります。
いくつかの観察?: 1) 二分木の場合、検索順序 (トップダウンの訪問) は通常レベル順と呼ばれ、他の可能な検索順序は前順、インオーダー、および後順ですが、私のツリーは必ずしも二分法ではありません。2) 幅優先探索アルゴリズムのようなものが機能する可能性がありますが、ノードは生成されるのではなく、ツリー トラバーサルによって選択されます。3) 標準の「置換」機能は、ツリーではなく、シーケンスに対してのみ機能します。4) 「subst」関数はツリーに対して機能しますが、一致するすべてのアイテムを置換する深さ優先の方法でトラバースするように見え、最初の置換後に停止する :count キーワード (「substitute」のように) がありません。
適切なアプローチをコーディングしたり、フレーミングしたりするのに役立つヘルプをいただければ幸いです。(また、なぜ common-lisp がリストとベクトルの両方に対してより多くの「ツリー」関数を持っていないのか不思議です。)