You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++ Qt 统计树结构最深层级符合规则的叶子节点数量

原代码问题分析

你之前的实现仅统计了根节点第一层子节点的子节点总数,既没有递归遍历所有层级,也没有先确定整棵树的最大深度,无法匹配你要求的「仅统计最深层级节点」的规则。

实现方案

你需要先确定整棵树的最大深度,再统计所有处于该深度的节点总数,即可得到有效叶子数。这里提供两种实现方式:

递归实现(逻辑简单易读)

首先实现两个工具函数:

  1. 计算树的最大深度
// 入参:当前节点、当前节点所处层级(根节点传入1)
int getMaxDepth(QTreeWidgetItem* node, int currentLevel) {
    if (node->childCount() == 0) {
        return currentLevel;
    }
    int maxDepth = currentLevel;
    for (int i = 0; i < node->childCount(); ++i) {
        int childDepth = getMaxDepth(node->child(i), currentLevel + 1);
        maxDepth = qMax(maxDepth, childDepth);
    }
    return maxDepth;
}
  1. 统计指定深度的节点数量
int countNodesAtDepth(QTreeWidgetItem* node, int currentLevel, int targetDepth) {
    if (currentLevel == targetDepth) {
        return 1;
    }
    if (node->childCount() == 0) {
        return 0;
    }
    int count = 0;
    for (int i = 0; i < node->childCount(); ++i) {
        count += countNodesAtDepth(node->child(i), currentLevel + 1, targetDepth);
    }
    return count;
}

调用方式:

// 假设根节点为root,根节点层级为1
int maxDepth = getMaxDepth(root, 1);
int validLeafCount = countNodesAtDepth(root, 1, maxDepth);

广度优先遍历实现(性能更优,避免递归栈溢出)

仅需一次遍历即可得到结果,适合节点层级深、数量多的场景:

#include <QQueue>
#include <QMap>

int countDeepestLeaves(QTreeWidgetItem* root) {
    if (!root) return 0;
    QMap<int, int> levelNodeCount;
    QQueue<QPair<QTreeWidgetItem*, int>> traverseQueue;
    // 根节点入队,层级设为1
    traverseQueue.enqueue(qMakePair(root, 1));

    while (!traverseQueue.isEmpty()) {
        auto current = traverseQueue.dequeue();
        QTreeWidgetItem* currentNode = current.first;
        int currentLevel = current.second;
        // 记录当前层级的节点数
        levelNodeCount[currentLevel]++;
        // 子节点入队
        for (int i = 0; i < currentNode->childCount(); ++i) {
            traverseQueue.enqueue(qMakePair(currentNode->child(i), currentLevel + 1));
        }
    }
    // 返回最大层级对应的节点数
    return levelNodeCount.last();
}

调用方式:

int validLeafCount = countDeepestLeaves(root);
验证效果

上述代码完全匹配你给出的三个示例:

  • 示例1返回2,符合预期
  • 示例2返回3,符合预期
  • 示例3返回1,符合预期

内容的提问来源于stack exchange,提问作者Megasa3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:45:03