我正在尝试使用智能指针实现二进制搜索树,我读到建议的实现方法是使用unique_ptr,因为父级拥有子级,并且二进制搜索树中没有多个所有者。
以这棵树为例,
10
4 20
2 5 11 30
3
这里4是10的左子,2是4的左子和3是2的右子,依此类推
现在结构看起来像
template<typename T>
struct TreeNode {
T data;
std::unique_ptr<TreeNode<T>> left, right;
};
有一个指向根的CCD_ 1。
现在,如果我理解正确的话,unique_ptr's
不能被复制或分配,它们对对象具有唯一的所有权。
因此,如果我想遍历树,我不能做一些事情,比如将std::unique_ptr<TreeNode<T>> temp
初始化到根并遍历从那里开始的每个节点,因为一旦我尝试将root
(即unique_ptr
(设置为temp
,它就会抛出错误。
那么,我需要使用类型为TreeNode*
的原始指针来遍历树并执行操作吗?这样做好还是安全?对于我在这棵树上的所有操作,我是否必须使用原始指针?
另一个问题是删除节点。如果我说要删除值为3
的节点。如果我初始化类型为TreeNode* temp
的原始指针并到达unique_ptr<TreeNode<T>> root
0。那么,如果我调用delete(temp(,会发生什么?来自TreeNode 2
的unique_ptr
指向TreeNode 3
。这个指针会发生什么情况?
那么如果我调用delete(temp(会发生什么?
TreeNode
将被销毁。注意delete
不需要括号
来自
TreeNode
2的unique_ptr
指向TreeNode
3。这个指针会发生什么情况?
指针变为无效,并且要销毁的unique_ptr
对象是未定义的行为,因为它将尝试将无效指针delete
。
那么我需要使用TreeNode*类型的原始指针来遍历树并执行操作吗?这样做好还是安全?对于我在这棵树上的所有操作,我是否必须使用原始指针?
你可以有一个指向std::unique_ptr
的引用(或指针(,你不需要复制它。
您可以调用unique_ptr
的reset
成员函数来释放指向TreeNode
的,而不是将delete
作为原始指针