- 项目上遇到了一个典型的多叉树应用案例, 记录一下。
(1)
//结构
typedef struct st_OriTree
{
int levelValue; //树的level
int orderValue; //排序值
QString nameValue; //当前节点名称
QString preNameValue; //前置节点名称
QMultiMap< int, st_OriTree *> childrenList; //子节点列表
}OriTree;
(2)
//创建多叉树,要求: 节点不允许重复。在构建的时候, 层次优先遍历树结构,查找重复节点。
void appendTreeNode(OriTree **head, OriTree node)
{
if (*head == nullptr)
return;
QQueue< OriTree*> queue;
queue.append(*head);
bool isExist = false;
OriTree* p = nullptr;
OriTree* q = *head;
while (!queue.isEmpty())
{
p = queue.front();
queue.pop_front();
if (p != nullptr)
{
for (int i = 0; i < p->childrenList.count(); i++)
{
if (p->childrenList.values().at(i)->preNameValue == node.preNameValue
&& p->childrenList.values().at(i)->levelValue == node.levelValue)
{
if (p->childrenList.values().at(i)->nameValue == node.nameValue)
{
isExist = true;
break;
}
continue;
}
if (p->childrenList.values().at(i)->levelValue == node.levelValue - 1
&& p->childrenList.values().at(i)->nameValue == node.preNameValue)
{
q = p->childrenList.values().at(i);
}
queue.append(p->childrenList.values().at(i));
}
}
}
if (!isExist && q!= nullptr)
{
//create new node
OriTree * newNode = new OriTree();
if (newNode == nullptr || p == nullptr)
{
qDebug() << "new OriTree node failed , node Name :" << node.nameValue;
return;
}
newNode->feedValue = node.feedValue;
newNode->levelValue = node.levelValue;
newNode->nameValue = node.nameValue;
newNode->orderValue = node.orderValue;
newNode->preNameValue = node.preNameValue;
Q_ASSERT(q->feedValue == nullptr);
if (q->feedValue != nullptr)
{
qDebug() << "new OriTree build tree error, node Name" <<