我有一个像这样的分层数据:
+----------------------+-------+
| 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等),因此很容易找出谁是节点的子节点。
这是我正在尝试构建的树。您可以看到,此树不是二进制的。所以应用递归似乎不是一个简单的想法。如果我错了,请纠正我。
那么我该怎么做呢?救命啊!
答案 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。