Asgari derinliğe sahip yaprak düğümü almak gerekiyor. Ben, çok teşekkürler, önermek lütfen her düğümünde ek bilgileri saklamak olmadan bunu yapmak için iyi bir yol düşünemiyorum.
bst en küçük derinlik yaprak düğümü bulmak
kaba kuvvet çözüm bulunana ilk yaprağın bir genişlik öncelikli arama sonlandırma olduğunu bu yinelemeli daha iteratif uygulamak kolay olacaktır.
Örneğin içinde sözde kod bakın "İlk Genişlik Birinci Vs Derinliği" cevabım sadece while-döngü başka bir koşul ekleyin.
BTW - Bu size alacak bir o derinlikte birden fazla olabileceğinden, asgari derinliğe sahip yaprağı. Minimum derinlik yaprakları tam set alma biraz daha zordur. Sanırım bir ile gitmek yinelemeli derinleşen stratejisi .
Düğüm biri olduğunu seviyeye ne bulma.
Üç seçenek:
İlk düğümü ve bunun için ağacın aşağı arama bulun. Bu savurgan gelebilir, ama onlar ikinci arama düzeyi olarak sadece kadar çok düğümleri ziyaret gerekir bu nedenle gerçekten hızlı.
Eğer gitmek gibi Alternatif sen takip edebilirsiniz. Üç sayaçlar kullanan levelCounter, thisLevelCounterve nextLevelCounter. Daha sen eksiltme yeni düğüme her zaman thisLevelCountersıfır çarptığında, ve bir seviyeye aşağı hareket ettik bunu
levelCounter++
thisLevelCounter = nextLevelCounter
nextLevelCounter = 0
Her zaman artırmak, arama listesine bir çocuk düğüm eklemek nextLevelCounter. Her zaman yeni bir çocuk düğüm artışı saklamaknextLevelCounter
Son olarak, yinelemeli derinleşen strateji size (yineleme ... bulur) ve eni ilk aramada aynı performans sırasını (biraz daha yüksek çarpan olsa da) vardır ücretsiz bir başarı düzeyini verir.
İşte kod sürümü (Ben herhangi bir hata kontrolünü kaçırmadık umut):
void min_leaf(node_t *t, int *min, int lev, node_t **n) {
if (!t) {
return;
}
if (lev > *min) {
printf("Back from %d at lev %d, min: %d already found\n",
t->key,
lev,
*min);
return;
}
if (!t->left && !t->right) {
if (*min > lev) {
*min = lev;
*n = t;
}
} else {
min_leaf(t->left, min, lev+1, n);
min_leaf(t->right, min, lev+1, n);
}
}
void bst_print_min_leaf(bst_t* bst) {
int min = 10000; /* Replace it with some really large number */
node_t *minn = NULL;
min_leaf(bst->root, &min, 0, &minn); /*level: root is level 0 */
if (minn) printf("min leaf is at depth: %d: (%p:%d)\n", min, minn, minn->key);
}













