私は、バイナリ検索ツリーの実装を書いている、と私はノードを見つけて、それはそこにかかったパス内のすべてのノードの二重リンクリストを返す関数を持っていると思います。私はそれが本当にいいこと(および冷却)同じクラスを使用できるようになりので、二重にリンクされたリストは、バイナリ検索ツリーに変換できることを知っています。
私は道に沿ってすべてのノードの浅いコピーを作成し、私は返すようにしたいバイナリ検索ツリーを構築するために彼らのポインタを変更し始める場合は、私は明らかに、元の木を破壊することがあります。私は、元のツリーを変更するために使用します、元のノードへの参照が必要になりますので、私はちょうど(...、バランスをとる、削除することができる)すべてのノードの深いコピーを作成することはできません。
例えば、私は、新しいノードが行くだろう、と私は単純にそこに子供の一人としてそれを置くことができる場所へのパスの最後のノードを返す呼び出しは見つけることの追加機能を、持っているかもしれません。私は、このいずれかをオフにサブクラス化することができた、(赤/黒の木、AVL木、スプレイ木)自己均衡バイナリツリークラスを書いている場合は、ノードの少なくとも親や祖父母へのアクセスがあると便利だろう私は(私は、余分なポインタを追跡することができたが、その後findメソッドは、汎用性の高いようではありません)を追加します。
もちろん、1つの解決策は、単に別のクラスを記述することです。別の解決策は、単独で、リンクされたリストのために解決し、対応する元のノードに戻って参照するために他のポインタを使用することであろう。しかし、この時点で、それは詳細だけで機能するソリューションを持つよりもです。私が使用している言語は、Javaであるが、他の言語でも、このためのいくつかの機能を持っている場合、私は間違いなく知ることに興味があると思います。それは私には非常に可能性が見えませんが、私は完全に何かが欠けている可能性があります。
これを行う方法があるかどう誰のノウハウはないか、私が代わりに行う可能性があります何のために何か提案がありますか?
だから、二重のリンクリストを構築するためのバイナリツリーに使用するノードクラスを使用します。私は、このノードクラスは、4つのフィールドを持っていることを前提としていますleffChild
、rightChild
、parent
、data
、どこdata
のノードに格納されたデータを保持しています。今、あなたが使用することによって、たとえば、二重リンクリストを作成するには、これらのフィールドを誤用することができますleftChild
ようprev
とrightChild
としてnext
二重リンクリスト内のノードのフィールド。あなたがそうなら、あなたはまだ使用できるparent
とdata
、そのノードのフィールドを。あなたが二重にリンクされたリストのための新しいノードを作成するが、持つことができるので、parent
これらのノードのフィールドは、バイナリツリーの各ノードを指します。
このビーイングは、あなたのアプローチは少し奇妙に聞こえる、と述べました。二重リンクリスト内のノードは1、未使用のフィールドを持つことになります。また、Javaは提供java.util.LinkedList二重リンクリストを実装しています。だから、バイナリツリーノードの難読化を使用することにより、独自のロールバックする必要はありません。