найти наименьший узел глубины листа в BST

голоса
1

Нужно, чтобы получить листовой узел, который имеет минимальную глубину. Я не могу придумать хороший способ сделать это без сохранения дополнительной информации в каждом узле, пожалуйста, предложить, спасибо очень много.

Задан 04/11/2011 в 01:03
источник пользователем
На других языках...                            


2 ответов

голоса
2

Скотина решение силы является поиск в ширину терминатор на первом листе нашел, что это будет проще реализовать итеративно, чем рекурсивно.

Смотри, например , псевдо-код в мой ответ на «Ширина Первый Vs Глубина первых» просто добавить еще одно условие в то время как петли.

BTW - Это поможет вам в лист с минимальной глубиной, так как там может быть больше , чем один на этой глубине. Получение полного набора минимальной глубины листьев немного сложнее. Я думаю пойти с итеративной стратегией углубления .


Обнаружение того, что уровень этот узел один.

Три варианта:

Найдите узел первый и поиск вниз по дереву для него. Это звучит расточительно, но второй поиск требует посещения только столько узлов, как уровень, так что это действительно очень быстро.

В качестве альтернативы вы можете отслеживать , как вы идете. Вы можете использовать три счетчика levelCounter, thisLevelCounterи nextLevelCounter. Каждый раз , когда вы больше нового узла вы декремента thisLevelCounter, и когда он достигнет нуля вы переместили вниз уровень так делать

levelCounter++
thisLevelCounter = nextLevelCounter
nextLevelCounter = 0

Каждый раз , когда вы добавить дочерний узел в список поиска, увеличивают nextLevelCounter. Каждый раз , когда вы сохраняете новый прирост дочернего узлаnextLevelCounter

Наконец, итерационная стратегия Углубления дает Sucess уровень бесплатно (который итерация находит его ...) и имеет тот же порядок выполнения (хотя немного выше множитель) в качестве ширины первого поиска.

Ответил 04/11/2011 в 01:06
источник пользователем

голоса
0

Вот код версии (надеюсь, что я не пропустил ни одной проверки ошибок):

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);
}
Ответил 25/03/2013 в 09:31
источник пользователем

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