具有多个子节点的树的广度优先打印

时间:2013-09-12 13:18:03

标签: c++ tree breadth-first-search

我有一个树数据结构,其中父节点可以有任意数量的子节点(> = 0)。(参见sample_tree.jpeg)我想创建这样的树。我想到的一种可能的方法是创建一个链接列表,如my_approach图片所示。链接列表如图所示连接。你能帮忙在这里用这种结构写出广泛的第一印刷品吗? 请用C ++编写代码。 如果不可能,你能建议合适的结构吗?enter image description here

my approach

1 个答案:

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

应该遍历所有节点并以广度优先的方式添加它们。

一个注意事项,我在此处将链接列表更改为向量,因为当您只需要将数据添加到容器的末尾时,它会更快。