Sağ İkili Ağaç Threading

oy
0

Ben bunu anlamaya çalışıyorum bir süre bir cehennem yaşıyorum. Her yerde ben sadece sigara yinelemeli (aslında anlıyorum parçası) aslında Listede çapraz nasıl yerleştirileceği konusunda içine bitiyor gibi görünüyor, bak. Orada kimse Başlangıçta listede geçmesi tam olarak nasıl çekiçlememesini ve gerçek öncel / halefi düğüm sınıfında yüzden can bayrak onları düğümlerin bulabilir mi? Ben basit bir ikili arama ağacı oluşturmak ve listeye geçmesi ve selefi / varisine boş bağlantıları yeniden yönlendirmek gerekiyor. Ben biraz aşağıdaki gibi bir çözüm ile bazı yaşamadık:

thread(node n, node p) {
     if (n.left !=null)
        thread (n.left, n);
     if (n.right !=null) {
        thread (n.right, p);
     }
     n.right = p;
}
Oluştur 29/07/2009 saat 19:11
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
1

açıklamanıza bakınca sizin gibi bir şey arayan bir yapıya sahip bir düğüme sahip varsayıyoruz:

Node {
  left
  right
}

... ve sol ve sağ kullanarak kurmak Bunlardan bir ikili ağaç varsa ve yeniden atama değerleri sol ve sağ tür için bu bir derinlik öncelikli geçişin bir doublely bağlı-listesini oluşturur bunu istiyorum o ağacı.

Kök Şu ana kadar ne var ile (hayır cinas tasarlamak) sorun çevirmesi esnasında geçirilen "düğüm p" (? Önceki kısaltması) o anda nerede ağaçtaki bağımsız olması gerektiğini - her zaman Daha önce ziyaret düğüm içermesi gerekir. Bunu yapmak için, her seferinde iplik aynı "önceki" değişkeni referans gerekiyor çalıştırılır. Bir C-izm ile bazı Python imsi sözde kod yaptık - Eğer aşina değilseniz, ' & ' anlamına gelen "referans için" (veya C # "ref") ve '*' "anlamına çözümlemesi ve bana vermek nesne "işaret ediyor.

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

Eğer C bu uygulamaya gittiğini varsa, aslında referansı tutmak için bir çift işaretçi gerekir, ama fikir aynıdır - tamamını çevirmesi esnasında "Son ziyaret edilen düğüm" konumunu devam etmek gerekir.

Cevap 31/07/2009 saat 05:36
kaynak kullanıcı

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