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

C++中删除二叉树后树大小未改变的问题求助

问题分析与解决办法

嘿,我来帮你排查下这个问题——你写的deletetree递归逻辑本身是没问题的,但删除后树的大小没变化,大概率是根节点的引用传递出了问题,或者无参size()函数的实现有疏漏。

核心原因拆解

  • 根节点未被正确置空
    你的BST类应该有一个成员变量(比如m_root)作为整棵树的根指针吧?如果调用deletetree时,你传入的不是这个根成员变量的引用,而是其他局部节点指针,那类里的m_root仍然会指向已经被释放的内存(这就是野指针)。此时调用size(),它还是基于这个野指针递归遍历,行为是未定义的,但可能会返回原来的大小(甚至直接崩溃)。

  • 无参size()函数的实现可能有问题
    你贴出的是带参数的size(Node *& cur_root),但你调用的是无参的size()。如果这个无参函数没有正确调用带参数的版本并传入当前根节点,而是返回了一个缓存的旧值(比如之前存的成员变量),那自然删除后大小不会更新。

具体解决步骤

1. 确保调用deletetree时传入类的根节点引用

假设你的BST类根节点成员是Node* m_root,调用时必须传入它的引用:

// 在类的成员函数中调用
this->deletetree(m_root);

这样执行完deletetree后,m_root会被置为NULL,后续计算大小就会返回0。

2. 修正无参size()函数的实现

无参size()应该直接调用带参数的版本,并传入类的根节点:

int BST::size() {
    // 传入类的根节点成员,确保每次都重新计算
    return size(m_root);
}

避免用缓存值,必须每次递归遍历当前树的节点。

3. 验证删除后的状态

可以在删除后加一些调试代码,确认根节点的状态:

deletetree(m_root);
cout << "删除后根节点是否为空?" << (m_root == NULL ? "是" : "否") << endl;
cout << "删除后树的大小:" << size() << endl;

如果根节点不为空,那肯定是调用deletetree时的传参错误,要检查你传入的是不是根节点的引用。

另外要注意:如果根节点没被置空,访问它的左右子树属于未定义行为,看似大小没变只是巧合,实际非常危险,可能导致程序崩溃或其他异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:36:56