Как найти ранг узла в дереве AVL?

голоса
4

Мне нужно реализовать два ранга запросов [ rank(k)и select(r)]. Но прежде чем я могу начать на этом, мне нужно , чтобы выяснить , как эти две функции работают.

Насколько я знаю, rank(k)возвращает ранг данного ключа k, и select(r)возвращает ключ заданного ранга r.

Так что мои вопросы:

1.) Как рассчитать ранг узла в качестве AVL (самобалансировани BST)?

2.) Можно ли более чем один ключ , чтобы иметь тот же ранг? И если да, то woulud select(r)вернуться?

Я собираюсь включать образец AVL дерево, которое Вы можете обратиться, если это поможет ответить на этот вопрос.

введите

Благодаря!

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


4 ответов

голоса
3

Ваш вопрос действительно сводится к тому: «как термин„ранг“обычно определяется относительно дерева AVL?» (И, возможно, как это «выбрать» обычно определяется как хорошо).

По крайней мере, как я видел этот термин используется, «Оценка» означает положение среди узлов в дереве - то есть, сколько узлов слева от нее. Вы, как правило, дается указатель на узел (или, возможно, ключевым значением), и вам нужно подсчитать количество узлов слева от него.

«Выбор» в основном наоборот - вы дали определенный ранг, и нужно получить указатель на указанный узел (или ключ для этого узла).

Два замечания: во-первых, так как ни один из этих модифицирует дерево вообще, это не имеет никакой реальной разницы, какая форма балансировки используется (например, AVL против красный / черный); по этому вопросу дерево, без балансирования на все эквивалентно, как хорошо. Во-вторых, если вам нужно сделать, это часто, вы можете улучшить скорость значительно добавляя дополнительное поле для каждого узла записи, сколько узлы слева от него.

Ответил 28/02/2011 в 04:07
источник пользователем

голоса
1

Ранг число узлов в левом поддереве дерева плюс один, и рассчитывается для каждого узла. Я считаю, что ранг не понятие специфичны для AVL деревьев - она ​​может быть вычислена для любого бинарного дерева.

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

Следующий код будет выполнять вычисление ранга:

void InitRank(struct TreeNode *Node)
{
        if(!Node)
        {
                return;
        }
        else
        {       Node->rank = 1 + NumeberofNodeInTree(Node->LChild);
                InitRank(Node->LChild);
                InitRank(Node->RChild);
        }

}


int NumeberofNodeInTree(struct TreeNode *Node)
{
        if(!Node)
        {
                return 0;
        }
        else
        {
                  return(1+NumeberofNodeInTree(Node->LChild)+NumeberofNodeInTree(Node->RChild));
        }
}
Ответил 30/08/2013 в 10:13
источник пользователем

голоса
0

Вот код, я написал и работал отлично для AVL дерева, чтобы получить ранг определенного значения. разница только вы использовали узел в качестве параметра, и я использовал ключ параметра. Вы можете изменить это, как свой собственный путь. Образец кода:

    public int rank(int data){
    return rank(data,root);
}

private int rank(int data, AVLNode r){
    int rank=1;
    while(r != null){
        if(data<r.data)
            r = r.left;
        else if(data > r.data){
            rank += 1+ countNodes(r.left);
            r = r.right;
        }
        else{
            r.rank=rank+countNodes(r.left);
            return r.rank;
        }
    }
    return 0;
}

[NB] Если вы хотите начать свой ранг от 0, то инициализировать переменный ранг = 0. Вы, безусловно, должны быть реализованы метод countNodes () для выполнения этого кода.

Ответил 08/09/2015 в 20:14
источник пользователем

голоса
-1

Вот что я сделал. В моей программе ранг элемента определяется как 1+ (без элементов больше, чем этот элемент). Вы можете отметить, что элемент не должен присутствовать в дереве.

Алгоритм поиска ранга:

1.In структуры дерева следить из нет элементов в суб дерева, включая корень. Таким образом, глава дерева содержит общие элементы в дереве.

2.Compare элемента с узлом, если он меньше, чем узел, то есть (1 + No.of элементов в правом ребенке) элементы больше, чем ключ element.Add его полный и рекурсивно поиск элемента в левый ребенок.

3.Если элемент больше, чем корневой узел, то просто найти элемент рекурсивно в правом ребенка. (Нет необходимости добавлять что-либо, так как мы пренебрегаем левое дерево, в котором все элементы меньше заданного ключа)

4.Terminate в Algo, когда вы найдете элемент достигается нуль.

Не Данная программа возвращает не элементов больше, чем данный ключ. 1+ возвращенного значение ранг.

Фрагмент кода:

int AVLUtils::rank(Node *root,long long val)
  {
    int n_ele_greater=0;
    int rank =0;

    if(root == NULL)
    return 0;
   if(val < root->key)
     {
    n_ele_greater = 1+this->n_elements(root->right_child)+this->rank(root->left_child,val);
     }
   else if(val > root->key)
     {
    n_ele_greater=this->rank(root->right_child,val);
    }

    else if(val == root->key)
    {
    return(this->n_elements(root->right_child));
    }
    return(n_ele_greater);
   }

Надеюсь это поможет :)

Ответил 03/10/2015 в 16:52
источник пользователем

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