C Поиск наибольшего числа в двоичном дереве

#c #binary-tree

#c #двоичное дерево

Вопрос:

Двоичное дерево чисел со структурой узлов

 type def numbernode
{
    unsigned value;
    numbernode * left;
    numbernode * right;
}
  

и внешний указатель (на корневой узел)
напишите функцию
в наибольшем (numbernode * tree)
вернет наибольшее число в дереве, если дерево не пустое. ваша функция должна возвращать -1, если дерево пустое.

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

Комментарии:

1. Если вы потратили часы, покажите нам кое-что из того, что вы пробовали, и тогда мы сможем помочь.

Ответ №1:

Проблемы рекурсии действительно легко решить, как только вы начнете думать о них правильным образом, особенно в отношении деревьев. «Какое наибольшее число в дереве? Ну, это самый высокий показатель для меня, моего левого дочернего элемента и моего правого дочернего элемента…какой самый высокий из моих левых дочерних элементов? ну, это самое высокое из этого дочернего элемента, его левое и правое ….» и так далее.

действительно простая задача рекурсии.

 int largest( node* root )
{
    if ( root == null )
        return -1;

    int left = largest(root->left);
    int right = largest ( root->right);
    if( root->value > left amp;amp; root->value > right )
       return root->value;
    else
       return max ( left, right );
}
  

Комментарии:

1. Я понимаю, поэтому я пошел дальше и добавил объяснение в

Ответ №2:

рекурсия — ваш друг — вот схема

 int maxValue(Node n) {

    if(n == null) return -1 // if this is a null node, get out with -1

    // each time you call this, it spawns a new version of this function
    // calling maxValue(root) could end up calling maxValue on a .left node
    // dozens of times before it calls one on a .right node!
    int left = maxValue(n.left) // get the left value's max
    int right = maxValue(n.right) // get the right value's max

    return max(this.value, left, right) // return the highest of the three values
}
  

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

P.S. синтаксис в моем коде просто неправильный. Например, здесь нет точек с запятой. Он также игнорирует указатели или что-либо еще. Думайте об этом только как о псевдокоде, удобном для C .

Комментарии:

1. Я копаюсь в этом старом сообщении, но что мы можем сделать, если дерево содержит все значения меньше -1?

Ответ №3:

Просто выполните обход дерева, используя любой из известных методов inorder, preorder или postorder. Вы обязательно столкнетесь с самым большим элементом во время обхода.

Ответ №4:

Просто пройдитесь по правой части дерева и верните последний ненулевой узел.

Комментарии:

1. В нем не говорится о двоичном дереве поиска или о том, что оно каким-либо образом отсортировано.

2. Двоичное дерево не обязательно упорядочено. Я бы сказал, что вы путаете двоичные деревья и деревья двоичного поиска

3. Какой смысл хранить число в дереве в первую очередь? Я знаю, что это было мое предположение, и что сравнение может не быть сравнением < > . В остальном точка снята.

4. Итак, я могу найти несколько десятков причин, по которым я бы хранил неупорядоченные числа в двоичном дереве. Черт возьми, даже в несбалансированном дереве. (даже объекты, обозначенные числами, просто для простора воображения). Это могло бы произойти в случаях, когда речь идет не только об узлах, но и о ребрах

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

Ответ №5:

Знаете ли вы алгоритмы обхода дерева (по порядку, перед заказом, после заказа)?

Нарисуйте простое дерево и выполните шаги карандашом. В какой-то момент в поддереве попробуйте «обобщить» описание, которое работает для поддерева, а затем посмотрите, сможете ли вы придумать описание, которое «продолжало» бы работать для всего дерева.