私の bst は、重複したエントリに対処できなければなりません。過剰な量のコードを必要としない、これを行うための戦略を誰かが持っていますか? 一貫して右側に重複を追加することを考えましたが、それでは bst の順序が台無しになります。たとえば、複製に 2 人の子がいて、その子が 2 人の子を持つ場合はどうなりますか? 複製を挿入するのは簡単ですが、置き換えられたノードで何をすればよいのでしょうか?
3 に答える
それが自己平衡 BST でない限り、等しいノードをそれらに等しいノードの左側または右側に配置しても問題はありません。
編集(サイモンの発言後):
問題の「複製ノード」にすでに 2 つの子がある場合は、単に「新しい複製ノード」を左に挿入し、「古い複製ノード」の左の子を「新しい複製ノード」の左の子にします。
例を挙げて明確にしましょう。複製を挿入する前のツリー:
4'
/ \
2 5
/ \
1 3
そして今、要素4''
が挿入されます:
4'
/ \
4'' 5
/
2
/ \
1 3
木が自己バランスをとっていない限り、問題はありません。
二分探索木のノードをリンクされたリストにすることができます。
class Data implements Comparable<Data>
{
// These are the data elements in your binary search tree
}
class TreeNode
{
TreeNode left; // elements less than current node, or null
TreeNode right; // elements greater than current node, or null
List<Data> items = new LinkedList<Data>();
}
ここで、treeNode.items
は常に空でないリストであり、item1.compareTo(item2) == 0
for everyitem1
およびitem2
in treeNode.items
.
重複した要素を挿入するには、関連するオブジェクトを見つけてTreeNode
、新しい項目を に追加しitems
ます。
TreeNode
要素を見つけるロジックは、関連するオブジェクトを見つけたら、リンクされたリストをたどる必要があることを除いて、以前とほとんど同じです。
重複したエントリを別々のノードとして実際に保存する必要があるのでしょうか。ノードにカウンター変数を追加するだけで十分でしょうか?そうすれば、ツリーをトラバースする場合、重複するエントリの数を把握し、順序を維持できます。