Нужно, чтобы получить листовой узел, который имеет минимальную глубину. Я не могу придумать хороший способ сделать это без сохранения дополнительной информации в каждом узле, пожалуйста, предложить, спасибо очень много.
найти наименьший узел глубины листа в BST
Скотина решение силы является поиск в ширину терминатор на первом листе нашел, что это будет проще реализовать итеративно, чем рекурсивно.
Смотри, например , псевдо-код в мой ответ на «Ширина Первый Vs Глубина первых» просто добавить еще одно условие в то время как петли.
BTW - Это поможет вам в лист с минимальной глубиной, так как там может быть больше , чем один на этой глубине. Получение полного набора минимальной глубины листьев немного сложнее. Я думаю пойти с итеративной стратегией углубления .
Обнаружение того, что уровень этот узел один.
Три варианта:
Найдите узел первый и поиск вниз по дереву для него. Это звучит расточительно, но второй поиск требует посещения только столько узлов, как уровень, так что это действительно очень быстро.
В качестве альтернативы вы можете отслеживать , как вы идете. Вы можете использовать три счетчика levelCounter, thisLevelCounterи nextLevelCounter. Каждый раз , когда вы больше нового узла вы декремента thisLevelCounter, и когда он достигнет нуля вы переместили вниз уровень так делать
levelCounter++
thisLevelCounter = nextLevelCounter
nextLevelCounter = 0
Каждый раз , когда вы добавить дочерний узел в список поиска, увеличивают nextLevelCounter. Каждый раз , когда вы сохраняете новый прирост дочернего узлаnextLevelCounter
Наконец, итерационная стратегия Углубления дает Sucess уровень бесплатно (который итерация находит его ...) и имеет тот же порядок выполнения (хотя немного выше множитель) в качестве ширины первого поиска.
Вот код версии (надеюсь, что я не пропустил ни одной проверки ошибок):
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);
}













