多叉树构建, 遍历(层次优先,深度优先),应用

这篇博客介绍了如何构建多叉树,并探讨了层次优先遍历(利用队列实现)和深度优先遍历(递归与非递归实现)的方法。在层次优先遍历中,通过队列按层次输出节点,而深度优先遍历则适用于寻找最长节点路径。此外,文章还讨论了如何在多叉树中记录节点的深度值以及如何销毁构建过程中产生的资源。
摘要由CSDN通过智能技术生成
  1. 项目上遇到了一个典型的多叉树应用案例, 记录一下。
    (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" << 
  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值