Yani bazı temel bilgisayar bilimi kavramlarını okumadan önce.
- İkili ağaç, dinamik olarak ayrılmış bir yapıdır (genellikle sıralı depolama için kullanılır).
- Doğası gereği ikili ağaçların çapraz geçişi genellikle özyinelemelidir;
Bunun nedeni, iki döngü yolu olduğunda doğrusal geçişin (bir döngü aracılığıyla) doğal olmamasıdır.- Özyinelemeli: Bu, kendisini çağıran bir işlev anlamına gelir.
- Eski moda dillerde, bellek yönetimi manuel bellek yönetimi gerektirir.
- Manuel: Bunu kendiniz yapmanız gerektiği anlamına gelir.
- Manuel bellek yönetimi yaptığınızda, gerçekte alttaki sistemden ağacın her üyesini serbest bırakmasını istemeniz gerekir.
- Ücretsiz: belleği yeniden kullanılabilir ve hafızanız tükenmez.
- Serbest: Bu, işlevi çağırarak
free()
ve kurtarmak istediğiniz işaretçiyi ileterek yapılır . - Pointer: Sanal bir sopa gibi. Sonunda bellek var. Bellek istediğinde, belleğe sahip bir işaretçi (sanal çubuk) verilir. İşiniz bittiğinde işaretçiyi (sanal çubuk) geri verirsiniz.
Özyinelemeli çözüm:
freeTree(Node* node)
{
freeTree(node->left);
freeTree(node->right);
free(node);
}
O zaman sorun, özyinelemenin tekrar tekrar aynı işlevi çağırdığınız anlamına gelir. Bu yığını büyütür. Yığını büyütmek daha fazla bellek kullanır. Ağacı boşaltmanızın sebebi, daha fazla bellek kullanarak belleği geri istemektir (her iki bellek parçasını da geri alsanız bile).
Sonunda soru:
Bu yüzden sorun, yukarıdaki özyinelemeli sürümü doğrusal bir çözüme dönüştürerek ortaya çıkar (böylece bellek kullanmanıza gerek yoktur).
Düğüm türünü verin
typedef struct Node Node;
struct Node
{
Node* left;
Node* right;
};
Bu düğümlerden bir ağacı serbest bırakmak için bir işlev yazın.
Kısıtlamalar:
- Özyineleme kullanılamaz (dolaylı olarak bile değil)
İzleme için dinamik alan ayrılamıyor.
Bir O (n) çözeltisi olduğuna dikkat edin
Kazanan:
- En İyi Karmaşıklık.
- Tie Break 1: İlk Gönderilen
- Tie Break 2: En az sayıda karakter.