Έχω δώσει δύο δυαδικά δέντρα αναζήτησης. Για παράδειγμα, τα Α και Β συνέχεια, μου ζητήθηκε να διαγράψει το δέντρο Β από το δέντρο Α
Με διαγραφή, εννοώ να διαγράψετε όλους τους κόμβους που υπάρχουν στο Β από το Α Σημείωση: Β δεν είναι απαραίτητα ένα υποδένδρο του Α
π.χ:
Α:
50 / \ 10 75 / / \ 1 60 90
ΣΙ:
10 / \ 1 75
Με αποτέλεσμα το δέντρο θα πρέπει να είναι:
50 \ 60 \ 90
Δύο προσεγγίσεις ήρθε στο μυαλό μου:
A1:
κόμβου * deleteTree (κόμβος * Α, ο κόμβος Β *)?
Πάρτε τη ρίζα του δέντρου Β διαγραφής κόμβου από δέντρο Ένα (με κανονική μέθοδο διαγραφής BST). Επόμενο διαιρούν το πρόβλημα σε δύο μέρη - για το αριστερό υποδένδρο του Β και του δικαιώματος υποδένδρο του Β Για καθένα από τα υποδένδρο, recurse. Για το αριστερό υποδέντρο, ο κόμβος που κατέλαβαν τον κόμβο που έχει διαγραφεί θα πρέπει να χρησιμεύσει ως η ρίζα για το δέντρο A. Για τη σωστή υποδέντρο, το inorder διάδοχο του διαγράφεται κόμβου θα πρέπει διακομιστή ως τη ρίζα των δέντρων Α
Α2: Η άλλη προσέγγιση είναι λίγο περίεργο. Θεωρώ ότι η inorder και παραγγελίας διάσχιση του δέντρου A. Να βρείτε και να διαγράψετε όλους τους κόμβους στο δέντρο Β χρησιμοποιώντας δυαδική αναζήτηση, μαζί με αναδρομή (εμείς δεν τροποποιήσει την προ-παραγγελία). Τέλος recostruct BST μας από την inorder (υπόλοιπο) και της παραγγελίας (αμετάβλητο).
Prob Α: Βρείτε έναν αποτελεσματικό τρόπο για την BST.
Prob Β: Βρείτε έναν αποτελεσματικό τρόπο για οποιοδήποτε δυαδικό δέντρο (και όχι μόνο BST).













