Вывести уровень дерева, в котором находится ключ

#c #binary-search-tree

#c #двоичный-поиск-дерево

Вопрос:

1 — Прочитать последовательность из n чисел и вставить ее в двоичное дерево поиска. (Я выполнил эту часть без каких-либо проблем.)

 Node *insert(Node **root, int k)
{
    if(*root == NULL)
    {
        Node *newNode = (Node *)malloc(sizeof(Node ));
        if(newNode == NULL)
            return NULL;
        newNode->key = k;
        newNode->left = NULL;
        newNode->right = NULL;
        (*root) = newNode; 
        return newNode; 
    }
    if(k < (*root)->key)
        return insert(amp;((*root)->left),k);
    else
        return insert((amp;(*root)->right),k);
}
  

2 — Прочитать число и вывести, на каком уровне оно находится. Выведите -1, если ключ отсутствует в дереве.
Эту часть я не знаю, как это сделать, я смог рассчитать только общую высоту дерева.

 int height(Node *aNode,int k) {
    if (aNode == NULL) {
        return -1;
    }

    int lefth = height(aNode->left,k);
    int righth = height(aNode->right,k);

    if (lefth > righth) {
        return lefth   1;
    } else {
        return righth   1;
    }
}
  

Пример:

по британскому летнему времени пример

Если заданное число равно 60, я должен напечатать 1

Если заданное число равно 27, я должен напечатать 3

Если заданное число равно 100, я должен вывести -1

Ответ №1:

Вы должны:

  • Прекратите обход и вернитесь 0 , когда значение будет найдено.
  • Возвращает -1 , когда значение не найдено у обоих дочерних элементов.
 int height(Node *aNode,int k) {
    if (aNode == NULL) {
        return -1;
    }

    if (aNode->key == k) return 0; /* add this */

    int lefth = height(aNode->left,k);
    int righth = height(aNode->right,k);

    if (lefth == -1 amp;amp; righth == -1) return -1; /* add this */

    if (lefth > righth) {
        return lefth   1;
    } else {
        return righth   1;
    }
}