Trouver le successeur sans utiliser le pointeur parent

voix
1

Le successeur d'un élément dans un BST est le successeur de l'élément dans l'ordre de classement déterminé par le parcours infixe. Trouver le successeur lorsque chaque noeud a un pointeur vers son nœud parent est présenté dans le manuel de l'algorithme de CLRS (Introduction aux algorithmes par la presse MIT).

L'idée de trouver le successeur est ici - si le sous - arbre droit du nœud xest non vide, le successeur xest l'élément minimum dans le sous - arbre droit. Dans le cas contraire, le successeur est l'ancêtre le plus bas de xdont l' enfant gauche est également un ancêtre de x( en supposant un noeud est un ancêtre de lui - même).

Peut-on trouver le successeur sans utiliser le pointeur sur le nœud parent?

Parfois, notre nœud de l'arbre n'a pas ce pointeur. Je me suis battu deux heures mais ne peut pas écrire le code.

Créé 26/09/2010 à 00:39
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
0

Si vous n'avez pas accès au pointeur vers le nœud parent, vous devez savoir qui est le père. Si vous ne savez pas, comment pourriez-vous aller dans l'arbre?

Créé 26/09/2010 à 00:55
source utilisateur

voix
2

Cela devrait fonctionner:

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-SUCCESSORgarde en c(du candidat) le dernier nœud dans lequel nous avons tourné à gauche.

Créé 26/09/2010 à 01:15
source utilisateur

voix
5

Inspiré par la solution de Sheldon, c'est la version non-récurrente de la solution.


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;
Si le candidat == NIL, x est le maximum dans l'arbre et ne dispose pas d'un successeur.

Créé 26/09/2010 à 18:17
source utilisateur

voix
1

J'ai trouvé une solution élégante pour successeur en ordre sans pointeur parent ici -> http://www.geeksforgeeks.org/archives/9999

L'idée est

1. Si le noeud a droit sous-arbre, puis son successeur est le plus petit élément dans le sous-arbre droit

  1. Si le droit de nœud sous-arbre est vide, son successeur est l'un de ses ancêtres, qui se trouve haut vers le bas sans pointeur parent, avec l'algorithme suivant:

laissez d'abord être current_node racine, succ_node = null;

Cas1: Si l'élément de recherche est inférieure à current_node, alors l'élément courant est un successeur potentiel - lieu succ_node au current_node et déplacer le current_node à son noeud gauche (parce que l'élément de recherche est dans le sous-arbre gauche)

affaire2: Si l'élément de recherche est supérieure à current_node, ne est pas un successeur potentiel (Comment un élément moins le successeur?). Donc pas besoin de placer le succ_node, mais déplacer le current_node à droite.

ne cesse de répéter le processus jusqu'à ce que vous atteignez nul ou l'élément lui-même et renvoyer le succ_node.

Créé 13/09/2012 à 01:17
source utilisateur

voix
0

Une solution Java récursive pourrait ressembler la manière suivante:

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

En tant que client, nous passons simplement de la valeur du noeud à partir duquel nous voulons connaître le successeur. Ensuite, nous commençons la recherche de la racine jusqu'à ce que nous avons trouvé la valeur que nous recherchions. Maintenant, il y a deux cas:

  1. Si le nœud actuel a un enfant à droite, puis le successeur le plus petit élément sous-arbre droit du noeud courant
  2. Dans le cas contraire, il était le nœud p (pointeur parent), qui a été mis à jour que lorsque nous sommes allés à gauche dans l'arbre
Créé 09/09/2013 à 17:41
source utilisateur

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