二叉树类 删除某节点为根的子树出错

天剑客 天剑客 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
问题一:如何在C++二叉树实现类中实现 对某节点为根子树的内存回收?
先是仿C风格的destory函数实现方式,得到了:
void BSTree::destory()
{
//释放以this为根的左右子树
if(this){
this->LChild->destory();
this->RChild->destory();

delete this;
this = NULL;
}
}

结果发现,this指针属于const指针,无法赋值为NULL,于是想到了下面的方法:
void BSTree::destory(BSTree **pRoot)
{
//释放以pRoot为根的左右子树
if(*pRoot){
destory(&((*pRoot)->LChild));
destory(&((*pRoot)->RChild));

delete *pRoot;
*pRoot = NULL;
}
}

在释放根节点左右子树都没有问题,但是在最后一个根节点释放时于delete *pRoot出现错误,原因可能为调用destory函数的对象由this指针传入,如果此时释放this指针,那么造成无法预估的错误。也不知道这样理解对不对。那么到底应该如何释放以pRoot为根的整个子树呢?
经修改,下列代码可以释放以调用对象为根的左右子树,但找不到方法删除对象本身。
void BSTree::destory()
{
//释放以this为根的左右子树
if(this){
if(this->LChild){
this->LChild->destory();
delete this->LChild;
this->LChild = NULL;
}
if(this->RChild){
this->RChild->destory();
delete this->RChild;
this->RChild = NULL;
}
}
}

问题二:如何写该类的析构函数能确保二叉树类对象内存能正确释放?PS:不能显式调用销毁函数
...全文

相关推荐

BST.rar_C++二叉树类_类 二叉树

**二叉树类**:创建一个类,包含对二叉树的操作,如构造函数、插入节点、删除节点、查找节点以及遍历方法。

weixin_42651887

C++二叉搜索树全实现:插入、遍历、查找、删除与深度计算

数据结构是编程的核心基石,二叉树作为最常用的树形结构之一,在搜索、排序、编译器设计、文件系统等场景中无处不在。二叉搜索树(BST)通过左小右大的有序约束,让查找、插入和删除在平均情况下达到O(log n)复杂度,是理解AVL树、红黑树等平衡树的基石。从C++工程实践出发,用类封装实现一棵完整的二叉搜索树,涵盖节点结构设计、递归与非递归遍历、层序队列实现、深度计算以及删除节点的三种情况处理,并给出可直接编译运行的完整代码。通过动手实现这些核心操作,开发者能够深入理解递归遍历的本质、指针操作的细节以及“有序性”

GreedyAbyss

二叉树类的定义和成员函数的实现

若`sub_root`为空,高度为0;否则,取左右子树高度中的较大值加1作为当前节点的高度。以上是二叉树类的基本功能实现。实际应用中,二叉树可能还需要实现其他操作,如查找、删除节点、平衡调整等。

michelle729917

Project-3-cs2336:创建了一个二叉树类,并使用它来存储和处理输入文件中的数据

插入节点通常从根节点开始,沿着左右子树路径找到合适的位置。查找节点则通过递归比较目标值与当前节点的值来确定是否继续深入子树。删除节点较为复杂,可能涉及到替换、调整树结构等操作。

观察社

删除二叉树节点java代码

**有两个子节点**:找到右子树中的最小节点(或左子树的最大节点),将其值复制到待删除节点,然后删除右子树(或左子树)的最小节点。

myoral
评论 10
收藏 已收藏
分享
返回顶部
天剑客
C++ 语言 65,214 成员 250,514 内容