Rechts Threading ein Binary Tree

stimmen
0

Ich habe eine Hölle einer Zeit versuchen, diese ein, um herauszufinden. Überall sehe ich, scheine ich nur in Erklärungen, wie ausgeführt werden, um tatsächlich durchqueren durch die Liste nicht-rekursiv (der Teil verstehe ich eigentlich). Kann jemand hämmert dort, wie genau ich zunächst durch die Liste gehen und die eigentlichen Vorgänger / Nachfolger-Knoten so kann ich Flag sie in der Knotenklasse finden? Ich muß in die Lage, einen einfachen binären Suchbaum zu erstellen und die Liste durchgehen und die Null-Links zu den Vorgängern / Nachfolger leiten. Ich habe etwas Glück mit einer Lösung etwas wie die folgenden habe:

thread(node n, node p) {
     if (n.left !=null)
        thread (n.left, n);
     if (n.right !=null) {
        thread (n.right, p);
     }
     n.right = p;
}
Veröffentlicht am 29/07/2009 um 19:11
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
1

Aus Ihrer Beschreibung, nehme an, ich Ihnen einen Knoten mit einer Struktur sucht so etwas wie:

Node {
  left
  right
}

... und dass Sie einen binären Baum von diesem mit den linken und rechten einrichten, und dass Sie Werte neu zu assign nach links und rechts, so dass es eine doublely-linked-Liste aus einem Tiefen ersten Durchlauf der schafft Baum.

Die Wurzel (kein Wortspiel beabsichtigt) Problem mit dem, was Sie bisher bekommen habe , ist , dass der „Knoten p“ (kurz für vorherige?) , Die während der Überquerung übergeben wird , muss unabhängig davon sein , wo im Baum Sie sich gerade befinden - es immer muss die zuvor besuchten Knoten enthalten. Um dies zu erreichen , wird jedes Mal Thread ausgeführt es den gleichen „vorherigen“ Variable verweisen muss. Ich habe einigen Python-ish Pseudo - Code mit einem C-ism getan - wenn Sie nicht vertraut sind, ‚ & ‘ bedeutet „ die Bezugnahme auf“ (oder „ref“ in C #) und ‚*‘ bedeutet „dereferenzieren und gib mir das Objekt , um es zeigt auf“.

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

Wenn Sie dies in C implementieren würden, dann werden Sie brauchen eigentlich einen Doppelzeiger die Referenz zu halten, aber die Idee ist das gleiche - Sie die Lage des „zuletzt besuchten Knoten“ während der gesamten Traversal bestehen bleiben müssen.

Beantwortet am 31/07/2009 um 05:36
quelle vom benutzer

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