我正在使用结构体对二叉树中的节点进行建模。在结构中,我试图有一个指向左右子项的指针。
问题是,由于我创建结构的方式,我一直遇到堆栈溢出。似乎我一直在处理智能指针的方式不断在堆栈上分配内存。
当我在 main 中创建root
时,会专门抛出异常。
我是智能指针的新手(我一直在使用原始指针,我最近了解到这是C++的不良做法(,并且我尝试自己解决这个问题,但没有运气。
有人可以批评我的结构/智能指针使用吗?非常感谢。
#include <iostream>
#include <memory>
//Node struct
struct Node
{
int data;
std::unique_ptr<Node> left;
std::unique_ptr<Node> right;
Node(int data) {
this->data = data;
this->left = std::make_unique<Node>(NULL);
this->right = std::make_unique<Node>(NULL);
}
};
//insert Node into binary search tree
void insert(int data, std::unique_ptr<Node>& root)
{
if (root == NULL)
{
root = std::make_unique<Node>(data);
}
else {
if (root->data > data)
{
insert(data, root->left);
}
else {
insert(data, root->right);
}
}
}
//In Order tree traversal
void inOrderTraversal(std::unique_ptr<Node>& root)
{
if (root == NULL) return;
inOrderTraversal(root->left);
std::cout << root->data << std::endl;
inOrderTraversal(root->right);
}
int main()
{
//Initialize root to NULL
std::unique_ptr<Node> root = std::make_unique<Node>(NULL);
insert(20, root);
insert(50, root);
insert(30, root);
insert(5, root);
insert(6, root);
insert(99, root);
insert(77, root);
insert(56, root);
insert(32, root);
inOrderTraversal(root);
return 0;
}
函数std::make_unique<Node>
采用参数来转发Node
构造函数。
在C和C++NULL
中通常只是一个宏0
。
因此,当您调用std::make_unique<Node>(NULL);
时,您正在使用data = 0
初始化Node
。
然后递归调用this->left = std::make_unique<Node>(NULL);
,最终导致无限递归和堆栈溢出。
要解决此问题,您可以分配std::unique_ptr<Node> left = NULL
.
我还建议在NULL
的地方使用nullptr
,因为它是类型安全的。只需将代码上的NULL
替换为nullptr
就会产生编译器错误,从而帮助您解决问题。
错误:没有匹配的构造函数来初始化"节点">
将所有NULL 替换为 nullptr,不要使用 std::make_unique(NULL(;
Node::Node(int data) {
this->data = data;
this->left = nullptr;
this->right = nullptr;
}
int main()
{
//Initialize root to NULL
std::unique_ptr<Node> root = nullptr;
// other codes ..
}