如何构建一个有或没有递归的非二叉树?

时间:2012-01-30 06:26:45

标签: c++ algorithm recursion tree

我有一个像这样的分层数据:

+----------------------+-------+
| name                 | depth |
+----------------------+-------+
| ELECTRONICS          |     0 |
| TELEVISIONS          |     1 |
| TUBE                 |     2 |
| LCD                  |     2 |
| PLASMA               |     2 |
| PORTABLE ELECTRONICS |     1 |
| MP3 PLAYERS          |     2 |
| FLASH                |     3 |
| CD PLAYERS           |     2 |
| 2 WAY RADIOS         |     2 |
+----------------------+-------+

TUBE,LCD和PLASMA是TELEVISIONS的孩子。 FLASH是MP3播放器的孩子。 MP3播放器,CD播放器和2路无线电是PORTABLE ELECTRONICS的子女。你得到了演习。

现在,我有一个包含其Id及其子节点的结构Node,依此类推,以构建一个树。像这样:

struct Node
{
   int id;
   list<Node*> children;
}

每个项目都由一个ID标识,即行号(ELECTRONICS = 0,TELEVISIONS = 1等),因此很容易找出谁是节点的子节点。

这是我正在尝试构建的树。您可以看到,此树不是二进制的。所以应用递归似乎不是一个简单的想法。如果我错了,请纠正我。

那么我该怎么做呢?救命啊!

4 个答案:

答案 0 :(得分:4)

您应该使用指向节点的指针,否则您将在每个级别复制树中的数据。

我还建议您使用枚举而不是int id,它会使代码更清晰。

使用非二叉树的递归没有问题,您只需要在left/right中的递归函数调用中调用list<Node*>(或类似的)。

答案 1 :(得分:0)

为了以递归方式构建树,树不应该是二进制的。它既可以使用递归方法也可以使用非递归方法创建。

对我来说,我会以自上而下的方式构建树,即在子节点之前创建父节点。我会以某种方式对输入数据进行排序以使消耗变为线性。要添加一个新节点,只需将深度作为参数并减少(从根向下),直到达到0,这就是节点所在的位置。当然,需要节点的父路径信息。

答案 2 :(得分:0)

这样的事情:

int main()
{
    Node  flash(FLASH_ID);
    Node  mp3(MP3_ID);

    mp3.children.push_back(flash);
    // repeat
}

答案 3 :(得分:0)

您可以使用多个链接指针。 即。

struct node
{
int id;
node *first_child;
node *second child;
node *third_child;
}

在您的情况下,最大值为3。 您可以使用不同的子节点指向节点并访问它们。如果少于3个孩子,则可以将其设为NULL。

相关问题