ご想像のとおり、この仮定には少し欠陥があります。定義したNode
タイプは、バイナリツリーの完全に細かいインスタンスです。
ジャックは、、挿入、削除などのTree
操作を提供するために、ノードのセット全体の周りにタイプを設定したいと述べています。getRoot
もちろんこれは悪い考えではありませんが、決して必須ではありません。これらの操作の多くはNode
それ自体で実行される可能性があり、必ずしもこれらの操作のすべてを実行する必要はありません。たとえば、getRoot
操作を行うことには賛成と反対の両方の引数があります。これに対する反論は、ある時点でサブツリーのみが必要なアルゴリズムがある場合Tree
、ルートを保持するオブジェクトが、アルゴリズムで不要になったsのNode
ガベージコレクションを防ぐというものです。Node
しかし、より一般的には、ここで尋ねる必要がある本当の質問はこれです:あなたが扱っているもののどれがインターフェースであり、どれが実装ですか?これは、バイナリツリーを呼び出し元へのインターフェイスとして公開する場合と、ある種の有限マップをインターフェイスとして提供する場合の1つであり、バイナリツリーは単なる実装の詳細であるためです。null
前者の場合、クライアントは、ツリーが値とブランチのいずれかであるか、またはであるかを「認識」し、Node
たとえば、ツリーの構造を再帰することができます。後者の場合、クライアントが「知っている」のは、クラスが何らかの形式のput
、get
およびをサポートしていることだけです。delete
操作が、これが検索ツリーとして保存されているという事実に依存することは許可されていません。後者の場合の多くの変形では、実際にTree
、クライアントからノードを隠すためのフロントエンドとしてタイプを使用します。(たとえば、Javaの組み込みjava.util.TreeMap
クラスがこれを行います。)
したがって、最短の答えは、実際には、状況によって異なります。少し長い答えは、バイナリツリーの実装とそのユーザーの間の契約が何であるかに依存するということです。呼び出し元がツリーについてどのようなことを想定できるか、バイナリツリーの詳細は、作成者が将来変更できると期待することなどです。