Hi everyone,
I'm coding a binary search tree. I have a question about the following struct Node, which I have seen has been implemented this way:
1 2 3 4 5 6 7 8
|
template <typename T>
struct Node{
T data;
std::unique_ptr<Node<T>> left;
std::unique_ptr<Node<T>> right;
Node<T>* parent;
};
|
Here (and on lots of sites) the left and right children are a
std::unique_ptr to a Node. I have some issues on "describing" this choice.
- Why should I prefer a unique pointer instead of a raw one for the children? I know that I can use only raw pointers, but I want to grasp the basic motivation of using unique pointers in this case.
For instance, if I say
std::unique_ptr<Node<T>> left{my_node}; I mean that
left owns a raw pointer to the node
my_node and the "uniqueness" comes from the fact that
left owns the object pointed to, which is the node
my_node.
- Why can't be the parent a unique_ptr too? I've read somewhere that I somewhat loose the uniqueness, but I can'y figure out what this means.
Let's say I have a node with value
8, with left child
3, and the right child of
3 is
6. If each parent is a unique_ptr, then I would have (for instance) that the parent of node
6 should be a unique_prt to
3, which is already "uniquely" owned by the left child of node
8 and hence I have a conceptual conflict, in some sense.
I don't think my argument above is correct, so any help is highly appreciated!