如何在树c ++中仅扩展叶子

时间:2015-12-08 20:03:48

标签: c++ expand

有人可以帮我解决这个问题。我的教授把它放在学习指南上,但我不知道如何解决这个问题,而且他没有给我们解决方案,所以任何帮助都会受到赞赏。在此先感谢您的时间!! 对不起,我不能在这里发布图片,但这里是一个问题图片的链接: http://postimg.org/image/f70i9dr7f/

3 个答案:

答案 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;
}