Můj BST musí být schopen vyrovnat se s duplicitní položky. Má někdo nějaké strategie, jak jít o to, že nevyžaduje nadměrné množství kódu? Myslel jsem, že důsledně přidávání duplikáty na pravé straně, ale pak to bude zkazit BST pořadí. Například to, co se stane, když duplicitní má dvě děti, které zase mají dvě děti ?. vložení duplikátu je dost snadné, ale to, co je třeba udělat s uzlem nahradil?
zabývající se duplikáty v BST
Dalo by se udělat uzly binárního vyhledávacího stromu do spojových seznamů.
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>();
}
Odtud treeNode.itemsje vždy non-prázdný seznam, takže item1.compareTo(item2) == 0pro každého item1a item2v treeNode.items.
Chcete-li vložit duplicitní prvek, měli byste si příslušnou TreeNodeobjekt a přidat novou položku items.
Logika zjištění prvků je téměř stejné jako ty předtím, kromě toho, že jakmile najdete příslušný TreeNodeobjekt, budete muset chodit na spojový seznam.
Tak dlouho, dokud to není samo vyrovnávací BST, nevidím problém s uvedením stejné uzly buď na levé nebo pravé straně uzlu, který se rovná k nim.
Edit (po poznámce simonn je):
V případě, že „duplicitní uzel“ v otázce už má 2 děti, pak stačí vložit „nové duplicitní uzel“ doleva a nechte levou dítě „staré duplicitní uzel“ se stal levý dítě „nové duplicitní uzel“.
Dovolte mi objasnit na příkladu. Strom před vložením duplikát:
4'
/ \
2 5
/ \
1 3
A teď je prvek 4'', který zní:
4'
/ \
4'' 5
/
2
/ \
1 3
Tak dlouho, jak je strom bez vlastního vyvážení, měli byste být v pořádku.
Zajímalo by mě, jestli jste skutečně potřebují ukládat duplicitní položky jako samostatné uzly? By přidání čítače proměnnou vašeho uzlu stačit? Tímto způsobem, když se procházet strom byste znát počet duplicitních záznamů a stále zachovat pořádek.













