Может кто-то, пожалуйста, помогите мне с этой проблемой. Мой профессор поместил его в учебное пособие, но я понятия не имею, как его решить, и он не дает нам решений, поэтому любая помощь была бы оценена. Спасибо заранее за ваше время!! К сожалению, я не могу добавлять изображения здесь еще, но вот ссылка на рис проблемы: http://postimg.org/image/f70i9dr7f/Как развернуть только листья в дереве C++
ответ
Так что ваша задача перейти к каждому узлу листьев в дереве и добавить 2 новых узлов к нему, как дети, используя x и y в качестве их значений. узлов листьев являются узлами, которые не имеют какие-либо сами ребенок так говорят, что ваш узел определяются как
struct Node{
int value;
Node* left;
Node* right;
}
затем в примере показывает в изображении 3'в узле, если он был сохранен в Node * Стиве; будет
steve->value = 3;
steve->left = NULL;
steve->right = NULL;
так что это было бы сделано в другое время, так что вы должны найти узлы, как левые и правые равный NULL, а затем создать новые узлы листа с й и у них так, как в вашем примере было бы
steve->left = new Node;
steve->left-> value = x;
steve->right-> value = new Node;
steve->right-> value = y;
так что это будет что-то вроде кода на самом деле добавить его, но вам придется придумать способ, чтобы пройти через дерево и найти те узлы
Давайте предполагать TreeNode является примерно так:
typedef int ItemType;
class Treenode
{
int value;
ItemType *left, *right;
}
Я хотел бы предложить рекурсивный метод:
Treenode* expand_leaves(Treenode* node, ItemType x, ItemType y)
{
/* If the argument node has no childs, he becomes father of x & y */
if(node->left == NULL && node->right == NULL)
{
node->left = new Node;
node->left->value=x;
node->right = new Node;
node->right->value=y;
}
else /* Otherwise if he has a left or right child, let's recall the function checking his child(s) */
{
if(node->left) expand_leaves(node->left, x, y);
if(node->right) expand_leaves(node->right, x, y);
}
return node;
}
Обратите внимание, что функция на самом деле изменяет дочерние узлы одного он получает в качестве аргумента, так что если вы используете его в назначении, как это:
Treenode *a, *b;
///... code that modifies a
b=expandleaves(a, 1, 2);
a и b указывают точно на тот же узел. Кроме того, я думаю, что, возможно, что-то забыл, но для меня это лучший способ.
Когда преподаватель сказал вернуть новое дерево, я вполне уверен, что это подразумевалось без каннибализации исходного дерева. Так что ваша идея почти правильная, но не совсем. – JSF
Правильно, и все, что я сделал об этом, было предупреждением об этом в конце ответа. Это потому, что я не могу ее полностью решить, но у меня была рекурсивная идея (что для меня ново, поэтому я был в восторге от этого). Я думал о возвращении указателя на Treenode new = &node;, но это не сработает, так как новый файл будет уничтожен после вызова. Есть идеи об этом? –
Я скопировал ваш код в свой ответ и внес изменения, чтобы исправить это. Обычно я обычно не крал ответ. Но для большой коррекции вы сказали, что не знаете, как это сделать, я не знал, как еще сообщить об этом (небольшая коррекция, я бы отредактировал ваш ответ). – JSF
Не видя доступных конструкторов Treenode
, некоторые из них догадываются и/или беспорядочно, чем это должно быть. Но основная идея - создать новый узел для каждой существующей позиции, а также для каждого нового листа.
Treenode* expand_leaves(Treenode* node, ItemType x, ItemType y)
{
if (node==0) return 0;
Treenode* result = new Treenode;
result->value = node->value;
/* If the argument node has no childs */
if(node->left == NULL && node->right == NULL)
{
result->left = new Treenode;
result->left->value=x;
result->right = new Treenode;
result->right->value=y;
}
else /* Otherwise if he has a left or right child, let's recall the function checking his child(s) */
{
result->left = expand_leaves(node->left, x, y);
result->right= expand_leaves(node->right, x, y);
}
return result;
}
Что вы пробовали? Какая у вас проблема с вашим кодом? Как это работает или нет? И, пожалуйста, [читайте о том, как задавать хорошие вопросы] (http://stackoverflow.com/help/how-to-ask) и о том, как создать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/помощь/mcve). –
Также обратите внимание, что люди не должны * приходить * на внешние сайты, чтобы отвечать. Ссылка на живой пример может помочь, но ваш полный вопрос должен быть здесь. –
Вместо того, чтобы размещать изображение своего вопроса, введите соответствующие биты в свой пост здесь. Это поможет другим найти ваш вопрос позже через поиск по ключевым словам. – josliber