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

