ebeveyn işaretçisi kullanmadan halefi bul

oy
1

Bir BST bir elemanın halefi inorder kastetmek ile belirlenen sıraya göre sıralanırlar öğenin halefi olduğunu. Her düğüm CLRS algoritması ders kitabı (MIT basın tarafından Algoritmalarına Giriş) sunulmuştur üst düğüme bir işaretçi sahip olduğunda halefi bulma.

Burada halef bulmak için fikir - düğümün sağ alt ağaç eğer xboş olmayan olduğunu halefi xsağ alt ağaç minimum unsurdur. Aksi takdirde, ardıl en düşük ata olan xolan sol çocuk da bir atası x(bir düğüm varsayarak kendisi bir atası).

Biz ana düğüme işaretçi kullanmadan halef bulabilir mi?

Bazen ağaç düğümü bu işaretçi yok. Ben birkaç saat mücadele etti ama doğru kodu yazamazsınız.

Oluştur 26/09/2010 saat 00:39
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
0

Üst düğüme pointer erişimi yoksa o zaman babanın kim olduğunu bilmek gerekir. Bunu bilmiyorsanız, nasıl ağacında gidebiliriz?

Cevap 26/09/2010 saat 00:55
kaynak kullanıcı

oy
2

Bu çalışmalı:

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-SUCCESSORiçinde tutar c(adayın) biz sola döndü hangi son düğümü.

Cevap 26/09/2010 saat 01:15
kaynak kullanıcı

oy
5

Sheldon'ın çözümü esinlenmiş bu çözümün özyinesiz versiyonudur.


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;
Aday == NIL Eğer x ağacında max ve bir ardıl yoktur.

Cevap 26/09/2010 saat 18:17
kaynak kullanıcı

oy
1

Burada ebeveyn pointer olmadan sipariş halefi için zarif bir çözüm bulduk -> http://www.geeksforgeeks.org/archives/9999

Fikir olduğu

düğüm sağ alt ağacı vardır 1.If, daha sonra halefi sağ alt ağaçta en az elementtir

  1. düğümün sağ alt ağaç boşsa, o zaman onun halefi aşağıdaki algoritma ile ebeveyn pointer olmadan yukarıdan aşağı, bulunabilir onun atalarından biridir:

Başlangıçta kök olmak current_node izin succ_node = null;

Durum 1: - current_node de yer succ_node ve (arama eleman sol alt ağacındaki olduğu için) sol düğüme current_node taşımak arama eleman current_node küçükse, o zaman şimdiki eleman potansiyel halefi

Durum 2: Arama eleman current_node sonra büyükse, onun değil potansiyel halefi (Nasıl daha az eleman halefi olabilir?). Yani gerek burada succ_node yerleştirmek ama sağa current_node taşımak için.

Eğer boş ulaşana kadar işlemi tekrarlayarak devam edebilir veya eleman kendisi ve succ_node dönün.

Cevap 13/09/2012 saat 01:17
kaynak kullanıcı

oy
0

Bir özyinelemeli Java çözüm aşağıdaki şekilde görünebilir:

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

İstemci olarak biz sadece biz halefi bilmek istediğiniz düğümün değer geçirir. biz aradığını değerini bulana kadar Sonra kökünden aramaya başlar. Şimdi iki durum vardır:

  1. Geçerli düğüm sonra geçerli düğümün sağ alt ağaçtaki en küçük elemanı halefi sağ çocuğu varsa
  2. Aksi takdirde, biz ağacın içinde bıraktı gitti yalnızca güncellendi düğüm p (ana işaretçisi) idi
Cevap 09/09/2013 saat 17:41
kaynak kullanıcı

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