我编写了一个程序来测试我的二叉树,当我运行它时,程序似乎崩溃了(btree.exe 已停止工作,Windows 正在检查解决方案......)。
当我通过调试器运行它并将断点放置在我怀疑导致它的函数 destroy_tree() 上时,它似乎按预期运行并返回到主函数。反过来,Main 从程序中返回,但随后光标跳回 destroy_tree() 并在其自身内反复循环。
下面是最小的代码示例,因此可以立即运行。我的编译器是 MinGW,我的调试器是 gdb(我正在使用 Code::Blocks)。
#include <iostream>
using namespace std;
struct node
{
int key_value;
node *left;
node *right;
};
class Btree
{
public:
Btree();
~Btree();
void insert(int key);
void destroy_tree();
private:
node *root;
void destroy_tree(node *leaf);
void insert(int key, node *leaf);
};
Btree::Btree()
{
root = NULL;
}
Btree::~Btree()
{
destroy_tree();
}
void Btree::destroy_tree()
{
destroy_tree(root);
cout<<"tree destroyed\n"<<endl;
}
void Btree::destroy_tree(node *leaf)
{
if(leaf!=NULL)
{
destroy_tree(leaf->left);
destroy_tree(leaf->right);
delete leaf;
}
}
void Btree::insert(int key, node *leaf)
{
if(key < leaf->key_value)
{
if(leaf->left!=NULL)
insert(key, leaf->left);
else
{
leaf->left = new node;
leaf->left->key_value = key;
leaf->left->left = NULL;
leaf->left->right = NULL;
}
}
else if (key >= leaf->key_value)
{
if(leaf->right!=NULL)
insert(key, leaf->right);
else
{
leaf->right = new node;
leaf->right->key_value = key;
leaf->right->left = NULL;
leaf->right->right = NULL;
}
}
}
void Btree::insert(int key)
{
if(root!=NULL)
{
insert(key, root);
}
else
{
root = new node;
root->key_value = key;
root->left = NULL;
root->right = NULL;
}
}
int main()
{
Btree tree;
int i;
tree.insert(1);
tree.destroy_tree();
return 0;
}
顺便说一句,我打算从 Code::Blocks 内置调试器切换到 DDD 来调试这些问题。我听说 DDD 可以直观地显示指向对象的指针,而不仅仅是显示指针的地址。您认为进行转换是否有助于解决这些类型的问题(数据结构和算法问题)?