Prawo Threading binarne drzewo

głosy
0

Mam piekło czasu próbując zrozumieć ten jeden. Wszędzie patrzę, wydaje mi się być uruchomiony tylko do wyjaśnienia, w jaki sposób faktycznie przechodzić przez listę non-rekursywnie (część I rzeczywiście zrozumieć). Może ktoś tam młotkiem w jak dokładnie mogę przejść na liście początkowo znaleźć rzeczywiste poprzednik / następca węzłów więc mogę flagę je w klasie węzła? Muszę być w stanie stworzyć prosty binarne drzewo poszukiwań i przejść przez liście i przekierować zerowej linki do poprzednika / następcy. Miałem trochę szczęścia z roztworem nieco podobny do poniższego:

thread(node n, node p) {
     if (n.left !=null)
        thread (n.left, n);
     if (n.right !=null) {
        thread (n.right, p);
     }
     n.right = p;
}
Utwórz 29/07/2009 o 19:11
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
1

Z Twojego opisu, będę zakładać masz węzeł ze strukturą poszukuje coś takiego:

Node {
  left
  right
}

... i że masz binarne drzewo z nich skonfigurować za pomocą lewej i prawej, a chcesz ponownie przypisać wartości do lewej i prawej strony w taki sposób, że tworzy doublely-linkowane listy z głębokości pierwszego przechodzenia z drzewo.

Korzeń (gra słów nie przeznaczonych) Problem z tym, co masz do tej pory jest to, że „węzeł p” (skrót od poprzedniego?), Które są przekazywane w trakcie przechodzenia musi być niezależny od tego, gdzie w drzewie, które aktualnie są - zawsze musi zawierać poprzednio odwiedzanej węzła. Aby to zrobić, każdy wątek czas prowadzony jest to musi odwoływać się do tego samego „poprzedni” zmienną. Zrobiłem trochę python-owski pseudo kod z jednym C-ism - jeśli nie jesteś zaznajomiony „ & ” oznacza „odniesienie do” (lub „ref” w języku C #) i „*” oznacza „dereference i dać mi celem jest wskazując”.

Node lastVisited
thread(root, &lastVisisted)

function thread(node, lastVisitedRef)
  if (node.left)
    thread(node.left, lastVisitedRef)
  if (node.right)
    thread(node.right, lastVisitedRef)

  // visit this node, reassigning left and right
  if (*lastVisitedRef)
    node.right = *lastVisitedRef
    (*lastVisitedRef).left = node
  // update reference lastVisited
  lastVisitedRef = &node

Jeśli jechaliśmy zaimplementować to w C, to rzeczywiście trzeba podwójny wskaźnik trzymać odniesienie, ale idea jest taka sama - trzeba utrzymywać położenie „ostatniej odwiedzonej węzła” podczas całego przechodzenia.

Odpowiedział 31/07/2009 o 05:36
źródło użytkownik

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