有人可以帮我解决这个问题。我的教授把它放在学习指南上,但我不知道如何解决这个问题,而且他没有给我们解决方案,所以任何帮助都会受到赞赏。在此先感谢您的时间!! 对不起,我不能在这里发布图片,但这里是一个问题图片的链接: http://postimg.org/image/f70i9dr7f/
答案 0 :(得分:1)
因此,您的任务是转到树中的每个叶节点,并使用x和y作为值为子节点添加2个新节点。 叶节点是自己没有子节点的节点,所以说你的节点被定义为
struct Node{
int value;
Node* left;
Node* right;
}
然后在示例中显示3的节点(如果它存储在图像中) 节点*史蒂夫; 会是
steve->value = 3;
steve->left = NULL;
steve->right = NULL;
所以这可能会在其他时间完成,所以你需要找到左边和右边的节点等于NULL,然后在它们中创建带有x和y的新叶子节点,就像在你的例子中一样,它将是
steve->left = new Node;
steve->left-> value = x;
steve->right-> value = new Node;
steve->right-> value = y;
所以这就像你实际添加它的代码一样,但是你必须想出一种方法来浏览树并找到那些节点
答案 1 :(得分:0)
让我们假设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将精确指向同一节点。 另外,我想我可能已经忘记了什么,但对我来说这是最好的方法。
答案 2 :(得分:0)
在没有看到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;
}