C++ 摧毁整个AVL树
我在完全删除我的AVL树时遇到问题。我已经知道了如何只删除一个节点,但是我的C++ 摧毁整个AVL树,c++,dynamic,recursion,avl-tree,C++,Dynamic,Recursion,Avl Tree,我在完全删除我的AVL树时遇到问题。我已经知道了如何只删除一个节点,但是我的destroyTree函数似乎并没有递归地销毁每个节点。我可能做错了什么 我有一个structnodeType 但这似乎并没有正确地删除节点,在检查高度时,它仍然提供调用destroy之前的高度,尽管在尝试打印时崩溃。在调用destroy tree的主函数中,我使用了一个简单的if语句 template <class myType> void avlTree<myType>::destroyTre
destroyTree
函数似乎并没有递归地销毁每个节点。我可能做错了什么
我有一个structnodeType
但这似乎并没有正确地删除节点,在检查高度时,它仍然提供调用destroy之前的高度,尽管在尝试打印时崩溃。在调用destroy tree的主函数中,我使用了一个简单的if语句
template <class myType>
void avlTree<myType>::destroyTree()
{
destroyTree(root);
if(root == NULL)
std::cout << "destroyed" << std::endl;
}
模板
void avlTree::destroyTree()
{
树(根);
if(root==NULL)
std::cout看看这段代码:
destroyTree(root);
if(root == NULL)
std::cout << "destroyed" << std::endl;
destroyTree(根);
if(root==NULL)
std::cout看看这段代码:
destroyTree(root);
if(root == NULL)
std::cout << "destroyed" << std::endl;
destroyTree(根);
if(root==NULL)
std::cout我猜您没有引用节点,因此当您将节点设置为NULL
时,实际上是将节点的本地副本设置为NULL
将不起作用,因为根
由值获取-在函数调用后将具有优先值:
template <class myType>
void avlTree<myType>::destroyTree(nodeType<myType>* node) // note node taken by value here
{
if(node != NULL) {
destroyTree(node->left);
destroyTree(node->right);
delete node;
}
node = NULL;
}
template <class myType>
void avlTree<myType>::destroyTree(nodeType<myType>* &node) // note node taken by reference here
{
if(node != NULL) {
destroyTree(node->left);
destroyTree(node->right);
delete node;
}
node = NULL;
}
我猜您没有引用节点,因此当您将节点设置为NULL
时,实际上是将节点的本地副本设置为NULL
将不起作用,因为根
由值获取-在函数调用后将具有优先值:
template <class myType>
void avlTree<myType>::destroyTree(nodeType<myType>* node) // note node taken by value here
{
if(node != NULL) {
destroyTree(node->left);
destroyTree(node->right);
delete node;
}
node = NULL;
}
template <class myType>
void avlTree<myType>::destroyTree(nodeType<myType>* &node) // note node taken by reference here
{
if(node != NULL) {
destroyTree(node->left);
destroyTree(node->right);
delete node;
}
node = NULL;
}
看起来不错,但我建议在删除后设置<代码>节点>左>代码>节点> ->右< /COD> >代码> null >代码>。你认为节点没有被删除?这是一种方法?我不记得C++,但是你必须说一些类似于<代码>自我的东西吗?调用destroyTree
后的函数仍然会给我高度,虽然它应该是零啊,也许你还需要在删除它之前将节点设置为NULL
?这样高度函数就不会只遍历旧的指针了?@TomZych它们都是。看起来不错,但我建议设置node->left
aND<代码>节点>右<代码> >代码> null >代码>删除。什么使节点不被删除?这是一种方法?我不记得C++,但是你必须说一些类似“代码>自我”的东西吗?高度虽然应该是zeroAh,但在删除它之前,可能还需要将节点设置为NULL
?这样高度函数就不会只遍历旧指针了?@TomZych它们都是。
template <class myType>
void avlTree<myType>::destroyTree(nodeType<myType>* &node) // note node taken by reference here
{
if(node != NULL) {
destroyTree(node->left);
destroyTree(node->right);
delete node;
}
node = NULL;
}