Găsiți succesorul fără a utiliza indicatorul părinte

voturi
1

Succesorul unui element într-un BST este succesorul elementului în ordinea stabilită de sortat traversal inordine. Găsirea succesorul atunci când fiecare nod are un pointer la nodul său părinte este prezentat în CLRS algoritmul manual (Introducere în Algoritmi de MIT Press).

Ideea de a găsi succesorul aici este - în cazul în care subarborelui drept al nodului xeste nevidă, succesorul xeste elementul minim în subarborele din dreapta. În caz contrar, succesorul este cel mai mic strămoș al xcărui copil stâng este , de asemenea , un strămoș al x(presupunând că un nod este un strămoș de la sine).

Putem găsi succesorul fără a utiliza indicatorul la nodul părinte?

Uneori, nodul nostru copac nu are acest indicator. M-am luptat câteva ore, dar nu se poate scrie codul corect.

Întrebat 26/09/2010 la 00:39
sursa de către utilizator
În alte limbi...                            


5 răspunsuri

voturi
0

Dacă nu aveți acces la indicatorul la nodul părinte atunci trebuie să știe cine este tatăl. Dacă nu-l știu, cum ar putea merge în sus în copac?

Publicat 26/09/2010 la 00:55
sursa de către utilizator

voturi
2

Acest lucru ar trebui să funcționeze:

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ține în c(candidatului) ultimul nod în care ne - am întors la stânga.

Publicat 26/09/2010 la 01:15
sursa de către utilizator

voturi
5

Inspirat de soluția lui Sheldon, aceasta este versiunea non-recursivă a soluției.


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;
În cazul în care candidatul == NIL, x este maximă în copac și nu are un succesor.

Publicat 26/09/2010 la 18:17
sursa de către utilizator

voturi
1

Am găsit o soluție elegantă pentru succesorul în ordine , fără indicatorul părinte aici -> http://www.geeksforgeeks.org/archives/9999

Ideea este

1.Dacă nodul are sub-arbore dreapta, atunci succesorul său este cel mai mic element din arborele de sub-dreapta

  1. În cazul în care dreptul sub-arbore al nodului este gol, atunci succesorul său este unul dintre strămoșii săi, care pot fi găsite în sus în jos, fără indicatorul părinte, cu următorul algoritm:

lasa initial current_node root, succ_node = null;

Case1: În cazul în care elementul de căutare este mai mică decât current_node, atunci elementul curent este un potențial succesor - locul succ_node la current_node și pentru a muta current_node la nodul său stâng (deoarece elementul de căutare este în subarborele stânga)

Cazul 2: În cazul în care elementul de căutare este mai mare, atunci current_node, sa nu un succesor potențial (Cum poate un element mai mic să fie succesorul?). Deci, nu este nevoie de a plasa succ_node aici, dar mutați current_node la dreapta.

repeta procesul până când ajunge nul sau elementul în sine și returnează succ_node.

Publicat 13/09/2012 la 01:17
sursa de către utilizator

voturi
0

O soluție Java recursiv ar putea arăta felul următor:

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

Ca un client, pur și simplu vom trece în valoarea nodului din care vrem să știm succesorul. Apoi vom începe căutarea de la rădăcină până când am găsit valoarea am căutat. Acum, există două cazuri:

  1. Dacă nodul curent are un copil drept, atunci succesorul cel mai mic element din subarborele din dreapta nodului curent
  2. În caz contrar, acesta a fost nodul p (indicatorul părinte), care a fost actualizată numai atunci când ne-am dus plecat în copac
Publicat 09/09/2013 la 17:41
sursa de către utilizator

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