I have been having an issue with a Binary Search Tree that I am making for a larger project.
There is a node:
template <class Key, class Value>
struct Node
{
public:
Key key;
vector<Value> value;
Node* leftNode;
Node* rightNode;
Node(Key k, Value v)
{
key = k;
value.push_back(v);
}
};
These nodes are being stored into the BST.
The error occurs in the Insertion function of the BST:
template <class Key, class Value>
void BinarySearchTree<Key, Value>::insert(const Key &key, const Value &value)
{
insert(root, key, value);
}
template <class Key, class Value>
void BinarySearchTree<Key, Value>::insert(Node<Key, Value> *&node, const Key &key, const Value &value)
{
if (node == nullptr)
node = new Node<Key, Value>(key, value);
// Error occurs here.
else if (node->key == key)
node->value.push_back(value);
else if (key < node->key)
insert(node->leftNode, key, value);
else
insert(node->rightNode, key, value);
}
The first node is inserted into the tree without issue, however the second Insertion call throws the error.
Any help in putting me on the right track would be greatly appreciated.
Your insert code seems to assume that Node::leftNode and Node::rightNode are initialised to nullptr but your constructor doesn't ensure that. Try this
Node(Key k, Value v)
{
key = k;
value.push_back(v);
leftNode = rightNode = nullptr;
}
Your code isn't initialising leftNode or rightNode. Raw pointer values are not value-initialised if there is no member initialiser for them. std::unique_ptrs are default constructed equal to nullptr
There also doesn't seem to be any cleanup of Nodes
template <class Key, class Value>
struct Node
{
public:
Key key;
std::vector<Value> value;
std::unique_ptr<Node> leftNode;
std::unique_ptr<Node> rightNode;
Node(Key k, Value v)
: key(k), value({v})
{ }
};
User contributions licensed under CC BY-SA 3.0