私はBST
、重複を許可しないことを知っています。たとえば、「RABSAB」という単語があるとします。
上記の文字列の二分探索木は次のとおりです。
R
/\
A S
\
B
重複をツリーに含めたい場合はどうでしょうか。木はどう変わる?インタビューでこんな質問をされました。
彼らは私に描くように頼んだ:
- 二分木
- 不均衡な二分探索木
- 重複のない二分探索木
- 重複のある二分探索木
どんな助けでも大歓迎です!
PS: 関連する木を描いてください
私はBST
、重複を許可しないことを知っています。たとえば、「RABSAB」という単語があるとします。
上記の文字列の二分探索木は次のとおりです。
R
/\
A S
\
B
重複をツリーに含めたい場合はどうでしょうか。木はどう変わる?インタビューでこんな質問をされました。
彼らは私に描くように頼んだ:
どんな助けでも大歓迎です!
PS: 関連する木を描いてください
重複なしで二分探索木に挿入するルールは次のとおりです。
重複するエントリを許可するには、次のようにルールを変更する必要があります。
また
また
したがって、重複する"RABSAB"BST
という単語は次のようになります。
R
/ \
A S
/ \
A B
/
B
または、
R
/ \
A S
\
A
\
B
\
B
また
R(1)
/ \
/ \
A(2) S(1)
\
\
B(2)
最初の 2 つのケースでは、挿入と検索の両方が少し複雑になります。ここにたくさんの説明があります。
そして 3 番目のケースは、メンテナンスがいくぶん簡単です。
それらのすべてが重複を許可するために正常に使用されています。選択はあなた次第です!
1 つのオプションは、1 つの分岐に重複が含まれるようにツリーを変更することです。たとえば、左側の分岐に親以下のノードを保持させたり、右側の分岐に親以上のノードを保持させたりします。
別のオプションは、すべての複製をノードに保存することです。
class Node {
Node left, right;
Object data;
}
代わりに
class Node {
Node left, right;
List data;
}
また
class Node {
Node left, right;
Object data;
int count;
}
入力については、LIST を使用して をRABPAB
作成し、BST
すべての等しい値のキーを格納できます。すべての等しい値のキーは、それを格納できるデータ構造を使用して同じレベルに配置されます。
BST は次のようになります。
R
/ \
A--A P
\
B--B
整数値を格納する BST の Java コードは、次のようになります。
class Node
{
Node left, right;
int data[maxvalue];
}
maxvalue
可能な最大の等しい値のキーは次のとおりです。
通常の BST では、挿入と検索の両方が未満 (>) およびより大きい (<) ルールに基づいて発生します。
代わりに、より小さい (>=) またはより大きい (<=) に挿入して、検索に同じルールを使用することもできます。
または、重複する要素に対応するために、すべてのノードに配列を含めることもできます。