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

如何计算二叉搜索树(BST)中Person对象的平均年龄?

解决BST中计算Person平均年龄的问题

首先补全你提到的Person类age getter(你说明已具备,这里明确写出方便后续代码):

#include <string>
using namespace std;

class Person{
private:
    string name;
    string job;
    int age;
public:
    int getAge() const { return age; } // 你的age getter
    // 其他构造函数、成员函数...
};

你的现有中序遍历用函数指针作为回调,但函数指针无法捕获外部变量(比如累加的年龄总和、计数),没法直接用来计算平均值。下面提供两种可行方案:

方案1:使用全局变量(简单但不推荐)

这是最直接的方式,但全局变量容易引发状态污染,不适合复杂场景:

#include <iostream>

// 全局变量用于累加
int totalAge = 0;
int personCount = 0;

// 回调函数:收集年龄和计数
void collectPersonData(const Person& p) {
    totalAge += p.getAge();
    personCount++;
}

// 调用示例
int main() {
    Bst<Person> bst;
    // 假设bst已填充数据...
    
    totalAge = 0; // 每次计算前重置状态
    personCount = 0;
    bst.InOrderTraversal(collectPersonData);

    if (personCount == 0) {
        cout << "BST为空,无法计算平均年龄" << endl;
        return 1;
    }

    double average = static_cast<double>(totalAge) / personCount;
    cout << "平均年龄:" << average << endl;
    return 0;
}

⚠️ 缺点:全局变量在多线程环境或多次调用时容易出错,状态难以管理。

方案2:改用std::function+Lambda捕获(推荐,现代C++风格)

修改BST遍历函数,将函数指针替换为std::function,这样可以用Lambda捕获外部变量,无需全局状态:

第一步:修改BST的遍历代码

#include <functional> // 必须包含该头文件

template <class T>
void Bst<T>::InOrder(Node<T>* root, const std::function<void(const T&)>& func) const
{
    if (!root) return; // 新增空指针判断,避免崩溃

    InOrder(root->left, func);
    func(root->GetData()); // 确保Node::GetData()可返回const T&,若原方法返回T&,可改为func(static_cast<const T&>(root->GetData()))
    InOrder(root->right, func);
}

template <class T>
void Bst<T>::InOrderTraversal(const std::function<void(const T&)>& func) const
{
    InOrder(this->root, func); // root为空时会直接返回
}

第二步:调用遍历计算平均年龄

#include <iostream>

int main() {
    Bst<Person> bst;
    // 假设bst已填充数据...

    int totalAge = 0;
    int personCount = 0;

    // 用Lambda捕获totalAge和personCount,遍历过程中累加
    bst.InOrderTraversal([&](const Person& p) {
        totalAge += p.getAge();
        personCount++;
    });

    if (personCount == 0) {
        cout << "BST为空,无法计算平均年龄" << endl;
        return 1;
    }

    double averageAge = static_cast<double>(totalAge) / personCount;
    cout << "平均年龄:" << averageAge << endl;
    return 0;
}

✅ 优点:无需全局变量,状态通过Lambda的引用捕获,安全且符合现代C++编程习惯,同时支持更灵活的回调逻辑。

额外注意点

  1. 原遍历代码未判断root是否为空,当BST为空时会访问root->left导致空指针崩溃,方案2中已补上空判断。
  2. 如果你的Node<T>::GetData()返回T&(非const引用),建议新增const版本的GetData()返回const T&,符合const正确性:
template <class T>
class Node {
private:
    T data;
public:
    T& GetData() { return data; }
    const T& GetData() const { return data; } // 新增const版本
    // 其他成员...
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 09:15:59