διαγραφή σε ένα δυαδικό δένδρο αναζήτησης

ψήφοι
5

Έχω δώσει δύο δυαδικά δέντρα αναζήτησης. Για παράδειγμα, τα Α και Β συνέχεια, μου ζητήθηκε να διαγράψει το δέντρο Β από το δέντρο Α

Με διαγραφή, εννοώ να διαγράψετε όλους τους κόμβους που υπάρχουν στο Β από το Α Σημείωση: Β δεν είναι απαραίτητα ένα υποδένδρο του Α

π.χ:
Α:

      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).

Δημοσιεύθηκε 31/08/2011 στις 10:06
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
0

Ο τρόπος που το βλέπω, γιατί δεν κάνετε μια inorder διάσχισης του b. Στη συνέχεια, έως ότου ο πίνακας δεν είναι κενή, κάντε μια κανονική διαγραφή από μια για την τιμή του δείκτη πίνακα. Διάσχιση είναι O (n) και διαγραφή για κάθε δείκτης θα είναι O (logn). Απόλυτα, αυτή η λειτουργία θα είναι O (nlogn).

Απαντήθηκε 31/08/2011 στις 10:27
πηγή χρήστη

ψήφοι
6

πρόβλημα

Υποθέτω ότι τα δύο δέντρα είναι ισορροπημένη.

void deleteTree(node* A, node* B)
{
    if(A == NULL || B == NULL)
        return;

    if(A->data == B->data)
    {
        deleteTree(A->left, B->left);
        deleteTree(A->right, B->right);
        removeNode(A); // Normal BST remove
    }
    else if(A->data > B->data)
    {
        Node* right = B->right;
        B->right = NULL;
        deleteTree(A->left, B);
        deleteTree(A, right);
    }
    else // (A->data < B->data)
    {
        Node* left = B->left;
        B->left = NULL;
        deleteTree(A->right, B);
        deleteTree(A, left);
    }
}

Ώρα πολυπλοκότητα:

T(N) = 2 * T(N / 2) + O(1)

Έτσι, η συνολική πολυπλοκότητα είναι O (Ν) σύμφωνα με μάστερ θεώρημα. Ο χώρος πολυπλοκότητα είναι O (1) . Ένα μειονέκτημα είναι Ι καταστραφεί B.

PS: Δεν έχω μια εφαρμογή BST στο χέρι και έτσι δεν μπορώ να δοκιμάσετε τον κώδικα για σας. Αλλά νομίζω ότι η ιδέα είναι σωστή.

πρόβλημα B

Χρησιμοποιήστε τον πίνακα κατακερματισμού για ένα δέντρο και διασχίζουν ένα άλλο. Θα πάρετε O (N) τόσο για το χρόνο και το χώρο πολυπλοκότητα.

Απαντήθηκε 31/08/2011 στις 14:12
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more