Δικαίωμα Threading ένα δυαδικό δέντρο

ψήφοι
0

Έχω μια κόλαση ενός χρόνου προσπαθώντας να καταλάβω αυτό έξω. Όπου κι αν κοιτάξει, μου φαίνεται να λειτουργεί μόνο σε εξηγήσεις για το πώς να διασχίσει πραγματικότητα μέσα από τη λίστα μη αναδρομικά (το μέρος που πραγματικά καταλαβαίνουν). Μπορεί κάποιος εκεί έξω σφυρί το πώς ακριβώς μπορώ να πάω στη λίστα αρχικά και να βρει την πραγματική του προκατόχου / διάδοχο κόμβους έτσι μπορώ σημαία τους στην τάξη κόμβο; Θα πρέπει να είναι σε θέση να δημιουργήσει ένα απλό δυαδικό Αναζήτηση δέντρο και να περάσουν από τη λίστα και αναδρομολόγηση των null συνδέσεις με τον προκάτοχο / διάδοχο. Είχα κάποια τύχη με διάλυμα κάπως σαν το ακόλουθο:

thread(node n, node p) {
     if (n.left !=null)
        thread (n.left, n);
     if (n.right !=null) {
        thread (n.right, p);
     }
     n.right = p;
}
Δημοσιεύθηκε 29/07/2009 στις 19:11
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
1

Από την περιγραφή σας, θα υποθέσουμε ότι έχετε έναν κόμβο με μια δομή που αναζητούν κάτι σαν:

Node {
  left
  right
}

... και ότι έχετε ένα δυαδικό δέντρο από αυτά που έχει συσταθεί με το αριστερό και το δεξί, και ότι θέλετε να ξανά-αναθέσετε τιμές προς τα αριστερά και δεξιά έτσι ώστε να δημιουργεί ένα doublely-συνδεδεμένη λίστα από βάθος πρώτη διάσχιση του δέντρο.

Η ρίζα (λογοπαίγνιο δεν προορίζονται) πρόβλημα με αυτό που έχετε μέχρι στιγμής είναι ότι ο «κόμβος p» (συντομογραφία για το προηγούμενο;) που έχει περάσει κατά τη διάρκεια της διάσχισης πρέπει να είναι ανεξάρτητη από όπου στο δέντρο που σήμερα είναι - πάντα πρέπει να περιέχει το έχετε ήδη επισκεφθεί κόμβο. Για να γίνει αυτό, κάθε νήμα φορά που τρέχετε πρέπει να αναφέρονται στην ίδια «προηγούμενο» μεταβλητή. Έχω κάνει κάποια Python-ish ψευδοκώδικα με ένα C-ISM - αν δεν είστε εξοικειωμένοι, « και » σημαίνει «αναφορά» (ή «διαιτητής» σε C #), και «*» σημαίνει «dereference και να μου δώσει το αντικείμενο αυτό δείχνει να».

Node lastVisited
thread(root, &lastVisisted)

function thread(node, lastVisitedRef)
  if (node.left)
    thread(node.left, lastVisitedRef)
  if (node.right)
    thread(node.right, lastVisitedRef)

  // visit this node, reassigning left and right
  if (*lastVisitedRef)
    node.right = *lastVisitedRef
    (*lastVisitedRef).left = node
  // update reference lastVisited
  lastVisitedRef = &node

Εάν επρόκειτο να εφαρμόσει αυτό το C, τότε θα πρέπει πραγματικά ένα διπλό δείκτη για να κρατήσει την αναφορά, αλλά η ιδέα είναι η ίδια - θα πρέπει να συνεχιστεί η θέση του «τελευταίου επισκέφθηκε κόμβο» όλη τη διάρκεια της διάσχισης.

Απαντήθηκε 31/07/2009 στις 05:36
πηγή χρήστη

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