#include <iostream>
using namespace std;
class Node {
public:
int data;
Node *left, *right;
Node()
{
data = NULL;
left = right = NULL;
}
};
Node* insertBST(Node* root, int value)
{
if (root == NULL) {
root->data = value;
root->left = root->right = NULL;
}
if ((root->data) > value)
insertBST(root->left, value);
if ((root->data) < value)
insertBST(root->right, value);
}
Node* printBST(Node* root)
{
if (root != NULL) {
printBST(root->left);
cout << "\n" << root->data;
printBST(root->right);
}
}
int main()
{
Node* root = new Node;
insertBST(root, 30);
insertBST(root, 20);
insertBST(root, 40);
insertBST(root, 70);
insertBST(root, 60);
insertBST(root, 80);
printBST(root);
}
上面是我为实现二进制搜索树而编写的代码。当我执行它时,程序停止响应并关闭。我试图从pythontutor.com获得帮助,但无法解决它,该怎么办才能使其无错误运行? 这是停止的地方:Click to see
感谢您的帮助,我是编写程序的新手。
答案 0 :(得分:0)
在insertBST
中,对于root == NULL
,您不会创建新节点并尝试修改root
的内容,因为它为null,这将导致访问冲突或分割错误。
我认为您的程序正在挂起而不是崩溃的原因是您正在使用一个在线编译器,该编译器会忽略无效的写操作,而是允许程序继续运行。然后,这可能最终通过insertBST
函数进行无限递归。
要解决此问题,您需要分配一个新节点,一种方法如下:
void insertBST(Node*& root, int value)
{
if (root == NULL) {
root = new Node();
root->data = value;
root->left = root->right = NULL;
}
if ((root->data) > value)
insertBST(root->left, value);
if ((root->data) < value)
insertBST(root->right, value);
}
请注意,您的程序泄漏了它分配的所有节点。您应该在Node
中编写一个析构函数,该析构函数将删除所有子节点,并在程序结尾处调用delete root
。另外,根本不要使用原始指针,而应使用std::shared_ptr
或std::unique_ptr
。