Βρείτε το διάδοχο χωρίς τη χρήση μητρικών δείκτη

ψήφοι
1

Ο διάδοχος ενός στοιχείου σε ένα BST είναι διάδοχος του στοιχείου στην ταξινομημένη σειρά καθορίζεται από την διάσχισης inorder. Η εύρεση του διαδόχου, όταν κάθε κόμβος έχει ένα δείκτη στη μητρική κόμβο παρουσιάζεται σε αλγόριθμο βιβλίο CLRS του (Εισαγωγή στους Αλγόριθμους από MIT Press).

Η ιδέα να βρει το διάδοχο εδώ είναι - αν το δικαίωμα υποδένδρο του κόμβου xείναι άδεια, ο διάδοχος του xείναι το ελάχιστο στοιχείο για τη σωστή υποδέντρο. Διαφορετικά, ο διάδοχος είναι η χαμηλότερη πρόγονος των xοποίων ο αριστερός παιδί είναι επίσης ένας πρόγονος των x(υποθέτοντας έναν κόμβο είναι ένας πρόγονος του ίδιου).

Μπορούμε να βρούμε τον διάδοχο χωρίς τη χρήση του δείκτη με το μητρικό κόμβο;

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

Δημοσιεύθηκε 26/09/2010 στις 00:39
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
0

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

Απαντήθηκε 26/09/2010 στις 00:55
πηγή χρήστη

ψήφοι
2

Αυτό θα πρέπει να εργαστεί:

TREE-SUCCESSOR(T, x)
  if right[x] != NIL
    return TREE-MINIMUM(right[x])
  else
    return FIND-TREE-SUCCESSOR(root[T], x, NIL)

FIND-TREE-SUCCESSOR(y, x, c)
  if y = x
    return c
  if key[x] < key[y]
    return FIND-TREE-SUCCESSOR(left[y], x, y)
  else
    return FIND-TREE-SUCCESSOR(right[y], x, c)

FIND-TREE-SUCCESSORκρατά το c(υποψήφιων) το τελευταίο κόμβο στον οποίο στρίψαμε αριστερά.

Απαντήθηκε 26/09/2010 στις 01:15
πηγή χρήστη

ψήφοι
5

Εμπνευσμένο από την λύση Sheldon, αυτό είναι η μη αναδρομική εκδοχή της λύσης.


if (right[x]  != NIL)
    return min(right[x]);
else
{
    candidate = NIL;
    y = root; 
    while  (y!= x) // y is used as a probe
if (key[x] < key[y]) { candidate = y; y = y ->left;
} else y = y->right; } return candidate;
Εάν υποψήφιος == ΜΗΔΕΝ, x είναι το μέγιστο στο δέντρο και δεν έχει διάδοχο.

Απαντήθηκε 26/09/2010 στις 18:17
πηγή χρήστη

ψήφοι
1

Βρήκα μια κομψή λύση για μια σε σειρά διάδοχος χωρίς μητρική δείκτη εδώ -> http://www.geeksforgeeks.org/archives/9999

ιδέα είναι

1.Εάν ο κόμβος έχει δικαίωμα υπο-δενδροειδή δομή, τότε διάδοχος της είναι το λιγότερο στοιχείο στο δεξιό υπο-δέντρο

  1. Αν το δικαίωμα υπο-δέντρο του κόμβου είναι άδειο, τότε ο διάδοχός του είναι ένας από τους προγόνους του, η οποία μπορεί να βρεθεί πάνω-κάτω χωρίς γονέα δείκτη, με τον ακόλουθο αλγόριθμο:

ας αρχικά current_node να είναι ρίζα, succ_node = null?

Περίπτωση 1: Εάν το στοιχείο αναζήτησης είναι μικρότερη από current_node, τότε το τρέχον στοιχείο είναι ένας πιθανός διάδοχος - θέση succ_node στο current_node και μετακινήστε το current_node στο αριστερό κόμβο της (επειδή το στοιχείο αναζήτησης είναι στο αριστερό υποδέντρο)

2η Περίπτωση: Αν το στοιχείο αναζήτησης είναι μεγαλύτερη από current_node, δεν είναι πιθανός διάδοχος του (Πώς μπορεί ένα μικρότερο στοιχείο είναι ο διάδοχος;). Έτσι, δεν χρειάζεται να τοποθετήσετε το succ_node εδώ, αλλά μετακινήστε το current_node προς τα δεξιά.

το επαναλαμβάνουμε τη διαδικασία μέχρι να φτάσετε μηδενική ή το ίδιο το στοιχείο και να επιστρέψει το succ_node.

Απαντήθηκε 13/09/2012 στις 01:17
πηγή χρήστη

ψήφοι
0

Μια αναδρομική λύση Java θα μπορούσε να εξετάσει τον ακόλουθο τρόπο:

public Integer successor(Integer value) {
    Node n = succ(root, value, null);
    if (null != n) {
       return n.value;
    }
    return null;
}

private Node succ(Node n, Integer x, Node p) {
    if (null == n) {
        return null;
    }

    if (x < n.value) {
        return succ(n.left, x, n);
    } else if (x > n.value) {
        return succ(n.right, x, p);
    }
    if (null != n.right) {
        return min(n.right);
    }
    return p;
}

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

  1. Εάν ο τρέχων κόμβος έχει το δικαίωμα του παιδιού, τότε ο διάδοχος το μικρότερο στοιχείο στο δεξί υποδέντρο του τρέχοντος κόμβου
  2. Διαφορετικά, ήταν ο κόμβος p (μητρική δείκτη), η οποία ενημερώνεται μόνο όταν πήγαμε αριστερά μέσα στο δέντρο
Απαντήθηκε 09/09/2013 στις 17:41
πηγή χρήστη

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