我有一个树数据结构,其中父节点可以有任意数量的子节点(> = 0)。(参见sample_tree.jpeg)我想创建这样的树。我想到的一种可能的方法是创建一个链接列表,如my_approach图片所示。链接列表如图所示连接。你能帮忙在这里用这种结构写出广泛的第一印刷品吗? 请用C ++编写代码。 如果不可能,你能建议合适的结构吗?
答案 0 :(得分:1)
将每个节点存储在链接列表中是一种(可能)糟糕的管理方式,因为您必须知道下一步应该去哪个顺序,特别是如果您不在订单中添加它们你想把它们甩掉。
更好的数据结构是为每个节点创建一个类,并为其提供一个向量的私有变量或其子节点的链接列表。
然后使用另一个类来管理每个节点的打印,方法是维护一个FIFO队列以便打印它们。
一些基本的伪代码,就像前一段时间我做的那样:
class Node {
public:
...
void addChildren(vector<Node*>*);
private:
vector<Node*> _children;
};
void addChildren(vector<Node*>* queue) {
for (unsigned int i = 0; i < _children.size(); i++) {
queue->push_back(_children.at(i));
}
}
其中队列变量只是由main函数维护的向量(或者如果你想要更好的封装,则是另一个类),它被迭代。您可能必须明确添加的唯一事情是队列的第一个节点。
然后从队列打印时:
vector<Node*> queue;
//create your nodes statically or dynamically
//populate the queue with the first node
for (unsigned int i = 0; i < queue.size(); i++) {
//print whatever you want from the node here
//This adds the current node's children to the end of the FIFO queue
queue.at(i)->getChildren(queue);
}
应该遍历所有节点并以广度优先的方式添加它们。
一个注意事项,我在此处将链接列表更改为向量,因为当您只需要将数据添加到容器的末尾时,它会更快。