C++中BTree二叉树类的析构函数内部应该编写什么内容?
二叉树析构函数实现方案
核心逻辑
二叉树所有节点都是通过new在堆上分配,析构需要递归释放所有节点,避免内存泄漏。我们可以利用C++析构函数的递归调用特性简化实现:
1. 先完善vertex类的析构函数
每个节点销毁时自动释放自己的左右子树,delete空指针是C++标准规定的安全操作,无需额外判空:
class vertex{ // 原有成员不变 ~vertex(){ delete leftChild; delete rightChild; } };
注意不要在vertex析构里释放parent指针,会导致循环释放崩溃。
2. 实现BTree类的析构函数
释放根节点即可触发整棵树的递归销毁,另外要注意你代码中作为类成员直接new出来的5个测试节点(Nikita/Vendor/faehrt/nach/Alexendria):
- 如果你把这些节点直接挂载到了树结构里,只需要释放根节点即可,不要重复释放这些节点,避免double free错误:
~BTree() { delete root; root = nullptr; }
- 如果这些测试节点没有挂载到树里,需要额外释放避免内存泄漏:
~BTree() { delete root; delete Nikita; delete Vendor; delete faehrt; delete nach; delete Alexendria; root = nullptr; Nikita = Vendor = faehrt = nach = Alexendria = nullptr; }
必须修复的隐藏问题
你代码中存在BTree C = B;的调用,C++默认生成的拷贝构造函数是浅拷贝,只会复制指针值,导致B和C两个对象指向同一批堆内存,两个对象析构时会重复释放同一内存直接崩溃,你需要手动实现深拷贝的拷贝构造函数和拷贝赋值运算符(遵守三五法则):
- 先在
BTree类中增加私有递归拷贝辅助函数:
private: vertex* copyNode(const vertex* source) { if (!source) return nullptr; vertex* newNode = new vertex(source->data); newNode->key = source->key; newNode->height = source->height; newNode->leftChild = copyNode(source->leftChild); newNode->rightChild = copyNode(source->rightChild); if (newNode->leftChild) newNode->leftChild->parent = newNode; if (newNode->rightChild) newNode->rightChild->parent = newNode; return newNode; }
- 实现拷贝构造函数:
BTree(const BTree& other) { root = copyNode(other.root); // 测试节点单独拷贝 Nikita = new vertex("Nikita"); Vendor = new vertex("Vendor"); faehrt = new vertex("faehrt"); nach = new vertex("nach"); Alexendria = new vertex("Alexandria"); }
其他小问题
- 你代码里成员变量名是
Alexendria,挂载节点时用的是Alexandria,拼写不一致会编译报错 vertex构造函数中用到的ID变量需要提前定义为全局静态变量,否则编译不通过
内容的提问来源于stack exchange,提问作者Vendor
相关产品推荐
相关产品推荐

