Dizilerin ile temsil 2 BST izomorf olup olmadıklarını Bulma

oy
0

1) Verilen aslında bir dizide yalnızca yaparak swapları vasıtasıyla yani bir ağacı () yeniden olmadan, tam bir ikili ağacın düzeyine göre (seviye) unsurlarını içeren 2 diziler, nasıl bu 2 diziler izomorf olup olmadığı bulabilirim?

2) Daha iyi bir çözüm bir izomorfik ağacın İkili arama ağacı oluşturur eğer.

güncelleştirme mesela

     5 
    / \
    4  7
   /\  /\
  2  3 6 8

dizideki temsil edilebilir: 5 4 7 2 3 6 8

Izomorfik ağaçları düğümleri etrafında dönme ile birbirlerine dönüştürülebilir ağaçlar

     5 
    / \
    4  7
   /\  /\
  2  3 6 8



     5 
    / \
    4  7
   /\  /\
  3  2 6 8



     5 
    / \
    4  7
   /\  /\
  3  2 8 6



     5 
    / \
    7  4
   /\  /\
  8  6 3 2
Oluştur 07/11/2011 saat 19:30
kaynak kullanıcı
Diğer dillerde...                            


4 cevaplar

oy
2

Aynı anda her ikisi üzerinde bir in-sipariş ağaç yürüyüş yapmak ve elementler aynı olup olmadığını kontrol edebilir.

Cevap 07/11/2011 saat 20:24
kaynak kullanıcı

oy
0

parçası olmak (2) ilk olarak, değiştirilebilir düğüm çifti - ve bunların soyundan - gerektiğinde her seviyede, sol düğüm <= doğru düğümü ile, bir ikili arama ağacına her ağaç açın. Bu zaman alacak n log n edecektir. Eğer bir ikili arama ağacı ve ikili arama ağacı bulunan ağaç izomorf olsaydı, Bunu yaptıktan sonra, artık iki ikili arama ağaçları var. yi_H işaret ettiği gibi, bu her iki ağaçlar izomorf ise bir in-sipariş ağaç yürüyüş aynı sırada aynı unsurları görüneceği anlamına gelir. Ama bir in-sipariş ağaç yürüme, sizin örneklerde olduğu gibi bir dizi saklanan bir ağaçta, sadece dizinin bütün elemanları ziyaret tuhaf bir yoludur, böylece ağaçlar izomorf ise iki diziler aynı olmalıdır.

Eğer ek alan bulabilirse parçasını işlemek için en kolay yolu (1) 'dir. Her ağacın en düşük düzeyi için yaprakları tutan her ağaç için bir karma tablo oluşturmak. onlar düğümler aynı set tutun yoksa iki hash tabloları ve çıkış karşılaştırın. Her yaprağı yaprak aynı olup olmadığını tanımlayıcılar aynıdır şekilde tanımlayan bir tanımlayıcı, verin. Bu yaprakların ebeveynler için her ebeveyn de değer ve bu çocukların tanımlayıcılar kullanılarak, başka karma tablo oluşturmak. Yine iki kümesi aynı ve çıkış eğer olmadığını kontrol edin. Her bir faj görüntüleme düğüm değeri aynıdır ve çocuk tanımlayıcıları, aynı ise aynı olan bir tanımlayıcı atama. Eğer kök ulaşana kadar ağacın yukarı bu şekilde devam edebilir. Tüm setleri yukarı aynı tüm yol varsa, iki izomorf ağaçlar ve tanımlayıcılar size her düzeyde yazışmalar verir. Bu (1) kısmı daha karmaşıktır ve ekstra alan, ancak yalnızca lineer zaman alır.

Cevap 08/11/2011 saat 06:26
kaynak kullanıcı

oy
2

İlk sorun için:

gösterimde ilgili biraz bilgi vermek

  • t0, t1 - ağaçlar
  • değeri (±) - düğüm saklandı sayı
  • sola (±) - sol alt ağaç
  • sağ (±) - sağ alt ağaç

t1ve t2izomorf, IFF vardır t1ve t2, boş

veya value (t1) == value (t2)

ve

ya left(t1)izomorf left(t2)ve right(t1)izomorfiktir right(t2),

veya left(t1)izomorf right(t2)ve right(t1)izomorfiktirleft(t2)

Ağaçlar bir dizide saklanır varsayarak, öyle ki eleman 0 köküdür ve ve eğer tbir iç düğümün bir dizin olduğunu 2t+1ve 2t+2onun hemen çocuk endeksleri, direk uygulanması şunlardır:

#include <stdio.h>

#define N 7

int a[] = { 5, 4, 7, 2, 3, 6, 8 };
int b[] = { 5, 7, 4, 6, 8, 2, 3 };

int
is_isomorphic (int t1, int t2)
{
  if (t1 >= N && t2 >= N)
    return 1;

  if (a [t1] != b [t2])
    return 0;

  return ((is_isomorphic (2*t1 + 1, 2*t2 + 1)
           && is_isomorphic (2*t1 + 2, 2*t2 + 2))
          || (is_isomorphic (2*t1 + 1, 2*t2 + 2)
              && is_isomorphic (2*t1 + 2, 2*t2 + 1)));
}

int main ()
{
  printf ("%s\n", (is_isomorphic (0, 0) ? "yes" : "no"));
  return 0;
}

İkinci sorun için, her adımda, biz alt ağacı karşılaştırmak aalt ağaçtaki daha küçük kökle bsonra daha küçük kökle ve alt ağacı aalt ağaçtaki daha büyük köküyle bbüyük köküyle (daha küçük ve daha büyük akım kökleri ave b).

int
is_isomorphic_bst (int t1, int t2)
{
  if (t1 >= N && t2 >= N)
    return 1;

  if (a [t1] != b [t2])
    return 0;

  int t1l, t1r, t2l, t2r;
  if (a [2*t1 + 1] < a [t1] && a [t1] < a [2*t1 + 2])
    {
      t1l = 2*t1 + 1;
      t1r = 2*t1 + 2;
    }
  else if (a [2*t1 + 1] > a [t1] && a [t1] > a [2*t1 + 2])
    {
      t1l = 2*t1 + 2;
      t1r = 2*t1 + 1;
    }
  else
    return 0;

  if (b [2*t2 + 1] < b [t2] && b [t2] < b [2*t2 + 2])
    {
      t2l = 2*t2 + 1;
      t2r = 2*t2 + 2;
    }
  else if (b [2*t2 + 1] > b [t2] && b [t2] > b [2*t2 + 2])
    {
      t2l = 2*t2 + 2;
      t2r = 2*t2 + 1;
    }
  else
    return 0;

  return is_isomorphic_bst (t1l, t2l) && is_isomorphic_bst (t1r, t2r);
}
Cevap 08/11/2011 saat 15:41
kaynak kullanıcı

oy
0

BST için:

  1. Dizilerin ve maçın hem ilk elemanlarını atın. Eşit Değilse o zaman BST aynı değildir.
  2. İlk sola çocukları bulun taranmış edilmemiştir ve maçın (pozisyonlara leftPos1 ve leftPos2 at). Sonra eşleşti Değilse BST aynı değildir.
  3. İlk sağ çocukları bulun taranmış edilmemiştir ve maçın (pozisyonlara rightPos1 ve rightPos2 at). Sonra eşleşti Değilse BST aynı değildir.
  4. hem sol ve sağ çocuklar eşleşirse, / (leftPos1 ve leftPos2 itibaren) alt ağaç ve (rightPos1 ve rightPos2 itibaren) sublists iki çifti üzerinde ardışık aynı işlemleri gerçekleştirmek. Bu ağacın üst dizisinin birinci elemandır.

alt liste içinde sol ve sağ çocukları araştırırken, zaten taranır unsurları olabilir. Böyle unsurları öğrenmek için, geçerli altağacın çocukları olabilir o öğeyi olun. Geçerli alt ağaç ebeveyn sol tarafında ise o zaman o öğeyi görmezden sağ tarafta aitse, o zaman, ebeveyn ile eleman karşılaştırın.

#include <stdio.h>

#define BOOL int
#define TRUE 1
#define FALSE 0

BOOL isLeft(int parent, int child) {
    return child <= parent;
}

BOOL isRight(int parent, int child) {
    return child > parent;
}

BOOL isBelongToChild(int parent, int child, int value) {
    if (isLeft(parent, child) && (isLeft(parent, value))) {
        return TRUE;
    }
    if (isRight(parent, child) && (isRight(parent, value))) {
        return TRUE;
    }
    return FALSE;
}

int getLeftPosition(int * array, int size, int parent, BOOL parentExists) {
    int i;

    int first = *array;
    for (i = 1; i < size; i++) {
        int value = *(array + i);
        if (! isBelongToChild(parent, first, value)) {
            continue;
        }
        if (isLeft(first, value)) {
            return i;
        }
    }
    return -1;
}

int getRightPosition(int * array, int size, int parent, BOOL parentExists) {
    int i;

    int first = *array;
    for (i = 1; i < size; i++) {
        int value = *(array + i);
        if (! isBelongToChild(parent, first, value)) {
            continue;
        }
        if (isRight(first, value)) {
            return i;
        }
    }
    return -1;
}

BOOL areSame(int * array1, int pos1, int * array2, int pos2) {
    if (pos1 == -1 && pos2 == -1) {
        return TRUE;
    } else if (*(array1 + pos1) == *(array2 + pos2)) {
        return TRUE;
    } else {
        return FALSE;
    }
}

BOOL isSameBst(int * array1, int size1, int * array2, int size2, int parent, BOOL parentExists) {
    if (0 == size1 && 0 == size2) {
        return TRUE;
    }
    if (*array1 != *array2) {
        return FALSE;
    }

    int leftPos1 = getLeftPosition(array1, size1, parent, parentExists);
    int leftPos2 = getLeftPosition(array2, size2, parent, parentExists);
    if (! areSame(array1, leftPos1, array2, leftPos2)) {
        return FALSE;
    }
    int rightPos1 = getRightPosition(array1, size1, parent, parentExists);
    int rightPos2 = getRightPosition(array2, size2, parent, parentExists);
    if (! areSame(array1, rightPos1, array2, rightPos2)) {
        return FALSE;
    }

    if (leftPos1 > -1) {
        int result = isSameBst((array1 + leftPos1), size1 - leftPos1, (array2 + leftPos2), size2 - leftPos2, *array1, TRUE);
        if (FALSE == result) {
            return FALSE;
        }
    }
    if (rightPos1 > -1) {
        int result = isSameBst((array1 + rightPos1), size1 - rightPos1, (array2 + rightPos2), size2 - rightPos2, *array1, TRUE);
        if (FALSE == result) {
            return FALSE;
        }
    }
    return TRUE;
}

int main ()
{
    int a[] = { 5, 6, 2, 7, 4 };
    int b[] = { 5, 6, 7, 2, 4 };
    printf ("%s\n", (isSameBst(a, 5, b, 5, 0, FALSE) ? "yes" : "no"));
    return 0;
}
Cevap 16/03/2013 saat 18:30
kaynak kullanıcı

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