Βάλτε σε μια σειρά το βαθύτερο διαδρομή ενός BST (επαναληπτικής)

ψήφοι
1

Im που προσπαθεί να βάλει σε μια σειρά το βαθύτερο μονοπάτι σε ένα BST χρησιμοποιώντας έναν αναδρομικό αλγόριθμο, και im πάρει αρκετές δυσκολίες ... γιατί το μόνο πράγμα που μπορώ να πάρω είναι το μέγεθος του μακρύτερου μονοπατιού (ισοδύναμο με το ύψος), και λοξοτομώ βάλει στη σειρά οι τιμές που αφορούν στο ύψος της BST ...

Οποιαδήποτε βοήθεια;

Δυστυχώς, δεν είχα εκθέσει το πρόβλημα σε ολόκληρο το δρόμο. Το μόνο πράγμα που ξέρω να κάνω αυτόν τον αλγόριθμο είναι η υπογραφή:

//each node has 3 references : value, left and right

private int [] deepestPath(Node root){ ...}

(Ι μπορεί να χρησιμοποιήσει AUX μεθόδους)

Δημοσιεύθηκε 24/07/2009 στις 23:04
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
1

Δοκιμάστε να χρησιμοποιήσετε κόμβους ως εργαλείο για να ανακατασκευάσει το βαθύτερο μονοπάτι

Το πρόβλημα θα μπορούσε να έχει είναι ότι δεν έχετε κανέναν τρόπο να αποθηκεύουν τα πραγματικά κόμβους καθώς διασχίζουν το δέντρο. Αυτό που χρειάζεστε είναι ένας τρόπος για να «θυμάται» το οποίο οι κόμβοι που έχετε επισκεφτεί στο δρόμο για το φύλλο που κρίνουν ότι είναι το βαθύτερο.

Αν BST σας εκπροσωπείται σε κόμβους, ίσως να θέλετε να εξετάσει την αποθήκευση μιας αναφοράς, σε κάθε παιδί, στη μητρική της. Με αυτόν τον τρόπο, όταν φτάσει στο βαθύτερο φύλλο, θα μπορούσε αναδρομικά ανακατασκευάσει το μονοπάτι πίσω στη ρίζα (ΣΗΜΕΙΩΣΗ: Η διαδρομή θα είναι σε αντίστροφη σειρά). Όπως αυτό:

if (isDeepest(node)) { // Once you find the deepest node...
  return reconstructPath(node); // ...reconstruct the path that took you there.
}

...

// reconstructPath is a method that takes a node (the deepest leaf) as 
// an argument and returns an array of the nodes from that node to the root.
private Array reconstructPath(Node node) {
  Array deepestPath = new Array();
  while(node.parent != node) { // Go up until you reach the root, which will be itself.
    deepestPath.add(node); // Add the node to end of the Array
    node = node.parent; // Go up one level to the parent of the node
  }
  deepestPath.reverse(); // reverse the order so it goes root->leaf
  return deepestPath;
}

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

Απαντήθηκε 24/07/2009 στις 23:29
πηγή χρήστη

ψήφοι
0

Με μητρική αναφορές

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

# Iterate through parents to trace the path in reverse.
node = deepestNode(tree)

while node.parent != None:
    node = node.parent

Χωρίς γονέα αναφορές

Αν δεν έχετε μητρική αναφορές, τότε μπορείτε να παρακολουθείτε την πορεία από τη ρίζα του δέντρου με την «τρέχουσα» κόμβο καθώς recurse μέσα από το δέντρο. Κάθε φορά που κάτω από, εκτός από αυτό το μονοπάτι ως το «μεγαλύτερο πορεία μέχρι τώρα», εάν η διαδρομή είναι μεγαλύτερη από ό, τι τα προηγούμενα σας «μακρύτερη διαδρομή μέχρι σήμερα». Ουσιαστικά αυτό σημαίνει ότι κάνει στοίβα κλήσεων σας ρητή.

Εδώ είναι μερικά κώδικα Python-ish:

# Public function. Sets up globals and then calls helper.
def deepestPath(tree):
    global longestPath, currentPath

    # Reset for a new search.
    longestPath = []
    currentPath = []

    _deepestPath(tree.root)

    return longestPath

# Helper function that does the real work.    
def _deepestPath(node):
    global longestPath, currentPath

    currentPath.append(node)

    # No children, we've bottomed out.
    if not node.left and not node.right:
        if currentPath.length > longestPath.length:
            # Save a copy of the current path.
            longestPath = list(currentPath)

    # Recurse into children.
    else:
        if node.left:  _deepestPath(node.left)
        if node.right: _deepestPath(node.right)

    currentPath.pop(node)
Απαντήθηκε 24/07/2009 στις 23:31
πηγή χρήστη

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