2

二分木が与えられた場合、kに等しいキーを持つツリー内のすべての要素を検索するためにメソッドfindAllElements(k)を実装する必要があります。

私が持っていたアイデアは、キーkを持つ要素に初めて遭遇したときです。同じキーを持つすべての要素は、左の子の右のサブツリーまたは右の子の左のサブツリーのいずれかにある必要があります。しかし、そうではないかもしれないと言われましたか?

アルゴリズムを実装する方法を見つける必要があります。したがって、擬似コードが必要です。

おそらくこれを追加すべきだったでしょう。ただし、実装では、左側のサブツリーにはルートのキー以下のキーが含まれ、右側のサブツリーにはルートのキー以上のキーが含まれます。

4

3 に答える 3

1

それはあなたのツリーの実装に依存します、二分木によって私はあなたが二分探索木を意味すると仮定し、そしてあなたはキーを比較するためにoperator<を使用します。つまり、ノードの左側のサブツリーには、ノードのキーよりもキーが小さい(<)ノードのみが含まれ、ノードの右側のサブツリーには、ノードのキーよりも小さい(!<)キーを持つノードのみが含まれます。

例えば

  7 
 / \
4   7
   / \
  6   8

ツリーに複数の等しいキーがある場合は、これを実行します

k < current_node_key,  search left subtree
k > current_node_key,  search right subtree
k == current_node_key, record current node , then search right tree
于 2013-02-28T19:06:03.853 に答える
0

現在のノードを見てください。キーがkより大きい場合は、左側のサブツリーを検索します。低い場合は、適切なサブツリーを検索します。等しい場合は、左と右の両方のサブツリーを検索します(また、結果に現在のノードを含めます)。

ルートノードから再帰的に開始します。

于 2013-02-28T18:54:09.350 に答える
0

先生と話をした後、戻ってきて結果がどうあるべきかを説明したいと思いました。したがって、キーがkに等しい要素を検索するメソッドfindElement(k)を実行する場合、検索する要素は、キーkを持つツリーの最上位の要素である必要があります(この要素をVと表記します)。

次に、この要素Vから、key = kを含む他の要素は、左側の子サブツリー(特に右端)または右側の子サブツリー(特に左端)のいずれかになります。したがって、左の子は、key = kの要素が見つかるまで、次のノードの右の子に移動し続けます...今...このノードをルートとするサブツリー内のすべての要素は、key = kである必要があります(これは、パート私は最初は認識していませんでした)したがって、この完全なサブツリーのあらゆる種類のトラバーサルを実行して、このサブツリー内のすべての要素を検索して保存できます(その中のすべてのノードにアクセスします)。このタイプのことは、右の子に対して繰り返す必要がありますが、key=kの要素が見つかるまですべての左の子を訪問します。

それは明らかにそれの単なる言葉の説明であり、長さ、そして混乱をお詫びします。うまくいけば、これは同様の問題を解決しようとしている他の人の助けになるでしょう。

于 2013-03-01T20:03:47.287 に答える