BST μου πρέπει να είναι σε θέση να αντιμετωπίσει τις διπλές καταχωρήσεις. Υπάρχει κάποιος που έχει οποιεσδήποτε στρατηγικές για το πώς να πάει για αυτό που δεν απαιτεί υπερβολικές ποσότητες κωδικό; Σκέφτηκα συνέπεια την προσθήκη αντίγραφα προς τα δεξιά, αλλά τότε αυτό θα χαλάσουν τη σειρά BST. για παράδειγμα τι συμβαίνει όταν το αντίγραφο έχει δύο παιδιά που με τη σειρά τους έχουν δύο παιδιά ?. εισάγοντας το αντίγραφο είναι αρκετά εύκολο, αλλά αυτό πρέπει να γίνει με τον κόμβο αντικατέστησε;
που ασχολούνται με αντίγραφα σε ένα BST
Θα μπορούσατε να κάνετε τους κόμβους του δυαδικού δένδρου αναζήτησης σε συνδεδεμένες λίστες.
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για κάθε item1και item2σε treeNode.items.
Για να εισάγετε ένα αντίγραφο των στοιχείων, θα βρείτε το σχετικό TreeNodeαντικείμενο και να προσθέσετε ένα νέο στοιχείο στο items.
Η λογική της εύρεσης στοιχείων είναι σχεδόν το ίδιο με το είχατε πριν, με τη διαφορά ότι μόλις βρείτε το σχετικό TreeNodeαντικείμενο πρέπει να περπατήσετε τη συνδεδεμένη λίστα.
Εφ 'όσον δεν είναι μια αυτο εξισορρόπησης BST, δεν βλέπω κάποιο πρόβλημα με τη θέση ίση κόμβους είτε στην αριστερή ή δεξιά του κόμβου που είναι ίσος με αυτούς.
Επεξεργασία (μετά την παρατήρηση simonn του):
Αν η «διπλούν κόμβο» στην ερώτηση έχει ήδη 2 παιδιά, τότε απλά εισάγετε το «νέο κόμβο διπλούν» προς τα αριστερά και αφήστε το αριστερό παιδί του «παλιού αντιγράφου του κόμβου» να γίνει το αριστερό παιδί του «νέου αντιγράφου του κόμβου».
Επιτρέψτε μου να διευκρινίσω με ένα παράδειγμα. Το δέντρο πριν τοποθετήσετε ένα αντίγραφο:
4'
/ \
2 5
/ \
1 3
Και τώρα το στοιχείο 4''εισάγεται:
4'
/ \
4'' 5
/
2
/ \
1 3
Εφ 'όσον το δέντρο δεν είναι αυτο εξισορρόπηση, θα πρέπει να είναι εντάξει.
Αναρωτιέμαι αν πραγματικά χρειαστεί να αποθηκεύσετε τις διπλές καταχωρήσεις ως ξεχωριστοί κόμβοι; Θα προσθήκη ενός μετρητή μεταβλητή για να Κόμβος σας είναι αρκετό; Με αυτόν τον τρόπο, αν διασχίζουν το δέντρο θα γνωρίζετε τον αριθμό των διπλών εγγραφών και εξακολουθούν να διατηρούν την τάξη.













