Trova il successore senza utilizzare il puntatore genitore

voti
1

Il successore di un elemento in un BST è successore dell'elemento nell'ordine ordinato determinato dal attraversamento in ordine simmetrico. Trovare il successore, quando ogni nodo ha un puntatore al suo nodo principale è presentato in algoritmo di libro di testo di CLRS (Introduzione agli algoritmi dalla stampa MIT).

L'idea di trovare il successore qui è - se il sottoalbero destro del nodo xè non vuoto, il successore di xè l'elemento minimo nel sottoalbero destro. In caso contrario, il successore è l'antenato più basso di xcui figlio sinistro è anche un antenato di x(assumendo un nodo è un antenato di se stesso).

Possiamo trovare il successore senza utilizzare il puntatore al nodo genitore?

A volte il nostro nodo della struttura non dispone di questo puntatore. Ho lottato un paio d'ore, ma non posso scrivere il codice corretto.

È pubblicato 26/09/2010 alle 00:39
fonte dall'utente
In altre lingue...                            


5 risposte

voti
0

Se non si ha accesso al puntatore al nodo padre, allora avete bisogno di sapere chi è il padre. Se non lo sai, come si potrebbe salire nella struttura?

Risposto il 26/09/2010 a 00:55
fonte dall'utente

voti
2

Questo dovrebbe funzionare:

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-SUCCESSORtiene in c(di candidati) l'ultimo nodo in cui ci siamo rivolti a sinistra.

Risposto il 26/09/2010 a 01:15
fonte dall'utente

voti
5

Ispirato da una soluzione di Sheldon, questa è la versione non ricorsiva della soluzione.


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;
Se candidato == NIL, x è il massimo nella struttura e non ha un successore.

Risposto il 26/09/2010 a 18:17
fonte dall'utente

voti
1

Ho trovato una soluzione elegante per il successore in ordine senza puntatore genitore qui -> http://www.geeksforgeeks.org/archives/9999

idea è

1.if il nodo ha diritto di sub-tree, allora il suo successore è l'elemento meno nella destra sottoalbero

  1. Se destra sottoalbero del nodo è vuota, allora il suo successore è uno dei suoi antenati, che possono essere trovati dall'alto senza puntatore genitore, con il seguente algoritmo:

lasciare inizialmente current_node essere radice, succ_node = null;

Caso 1: Se l'elemento di ricerca è inferiore a current_node, quindi l'elemento corrente è un potenziale successore - posto succ_node al current_node e spostare il current_node al suo nodo di sinistra (perché l'elemento di ricerca è nel sottoalbero sinistro)

case2: Se l'elemento di ricerca è maggiore di current_node, non è un potenziale successore (Come può un elemento minore sarà il successore?). Quindi nessun bisogno di mettere la succ_node qui, ma spostare il current_node a destra.

continua a ripetere il processo fino a raggiungere nullo o l'elemento stesso e restituire il succ_node.

Risposto il 13/09/2012 a 01:17
fonte dall'utente

voti
0

Una soluzione Java ricorsiva potrebbe apparire nel modo seguente:

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;
}

Come cliente abbiamo semplicemente passare il valore del nodo da cui si vuole conoscere il successore. Poi iniziamo a cercare dalla radice finché non abbiamo trovato il valore che stavamo cercando. Ora ci sono due casi:

  1. Se il nodo corrente ha un figlio destro, poi il successore del più piccolo elemento nel sottoalbero destro del nodo corrente
  2. In caso contrario, è stato il nodo p (puntatore genitore), che è stato aggiornato solo quando siamo andati a sinistra all'interno della struttura
Risposto il 09/09/2013 a 17:41
fonte dall'utente

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