Нахождение КТН наименьшее значение в BST

голоса
0

Вот то, что я должен найти КТН наименьшее значение в двоичном дереве поиска:

struct treeNode 
{
   int data;
   struct treeNode *left, *right:
};

int rank(stuct treeNode* ptr, int k)
{
   if(node == NULL)
    return root; 

   while(ptr->left != NULL) {
     ptr = ptr->left;
     return rank(ptr->left)
   }
}

Это, очевидно, не является правильным. Без предоставления решения, может кто-то наставит меня в правильном направлении, чтобы, как я мог бы решить эту проблему? У меня возникли проблемы, выяснить, как я мог бы найти КТН наименьший элемент в BST.

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


3 ответов

голоса
0

Это должно работать:

int rank(struct treeNode* n,int k,int* chk)
    {
    if(!n) return -1;
    int _chk = 0;
    if(!chk) chk = &_chk;

    int t = rank(n->left,k,chk);
    if(t>=0) return t;

    if(++*chk > k) return n->data;

    int t = rank(n->right,k,chk);
    if(t>=0) return t;
    return -1;
    }

называем rank(root,k,0)

Ответил 03/05/2011 в 02:35
источник пользователем

голоса
1

Если у вас есть размеры каждого из поддеревьев, это может быть выполнимо без необходимости считывать данные в массив (или в противном случае обхода дерева) и подсчитывая. Если вы не будете держать информации о размере удобно, вам нужна вспомогательная функция для вычисления размера.

Основная идея, выяснить, что индекс текущего узла. Если оно меньше, чем к, вам нужно искать левое поддерево. Если он больше, чем к, поиск права компенсирующего узлов подсчитываются слева и ток. Обратите внимание, что это по сути то же самое, что и поиск через обычный BST, кроме этого времени мы ищем по индексу, а не данных. Некоторые псевдокод:

if size of left subtree is equal to k:
    // the current node is kth
    return data of current node
else if size of left subtree is greater than k:
    // the kth node is on the left
    repeat on the left subtree
else if size of left subtree is less than k:
    // the kth node is on the right
    reduce k by the size of the left subtree + 1 // need to find the (k')th node on the right subtree
    repeat on the right subtree

Для иллюстрации рассмотрим это дерево с отмеченными показателями (даже не беспокоиться о данных, как это не важно в поиске):

        3
      /   \
     2     6
    /     / \
   0     4   7
    \     \
     1     5

Предположим , что мы хотим найти 2 - е (к = 2).
Начиная с 3, размер левого поддерева равен 3.
Это больше , чем к настолько перейти на левое поддерево.
Размер левого поддерева равен 2.
К также 2 , так что текущий узел должен быть вторым.

Предположим , что мы хотим найти 4 - е (к = 4).
Начиная с 3, размер левого поддерева равен 3.
Это меньше , чем л так отрегулировать новый K равным 0 (к»= 4 - (3 + 1)) и перейти на правое поддерево.
Начиная с 6, размер левого поддерева равен 2.
Это больше , чем к»(0) , поэтому перейти на левое поддерево.
Размер левого поддерева равен 0.
к»также 0 , так что текущий узел должен быть четвёртым.

Вы получаете идею.

Ответил 03/05/2011 в 02:45
источник пользователем

голоса
5

БСТ является отсортированным бинарным деревом, в-порядок обход (левое поддерево, текущий узел, правое поддерево) даст отсортированные значения узлов. Чтобы найти KTH наименьший узел, просто сделать обход упорядоченную со счетчиком. Счетчик начинается с 0, всякий раз, когда узел будет пройден, увеличить его на единицу, когда она достигает к, узел является -й наименьшим.

Ответил 03/05/2011 в 02:47
источник пользователем

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