#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:
Знаете ли вы алгоритмы обхода дерева (по порядку, перед заказом, после заказа)?
Нарисуйте простое дерево и выполните шаги карандашом. В какой-то момент в поддереве попробуйте «обобщить» описание, которое работает для поддерева, а затем посмотрите, сможете ли вы придумать описание, которое «продолжало» бы работать для всего дерева.