我用c ++实现了二叉搜索树.而不是使用裸指针指向我使用的节点的孩子std::shared_ptr.树的节点如下实现
struct treeNode;
typedef std::shared_ptr<treeNode> pTreeNode;
struct treeNode {
T key;
pTreeNode left;
pTreeNode right;
treeNode(T key) : key(key), left(nullptr), right(nullptr) {}
};
Run Code Online (Sandbox Code Playgroud)
从BST中删除节点时,其中一种情况是节点只有一个子节点.该子节点简单地替换该节点,如下所示:
| remove node
node ---------> |
\ right
right
Run Code Online (Sandbox Code Playgroud)
在类似的Java实现中,这可以编码为:
node = node.getRight();
Run Code Online (Sandbox Code Playgroud)
在我的C++实现中,它是:
node = node->right;
Run Code Online (Sandbox Code Playgroud)
其中node是type pTreeNode.
在pTreeNode(std::shared_ptr<TreeNode>)上调用=运算符时,node将调用析构函数.指向底层的共享指针的数量TreeNode是1,因此TreeNode被破坏释放其内存.当TreeNode(默认)调用析构函数,每个成员都毁灭了.这肯定会导致pTreeNode right成员被摧毁.问题node->right在于分配给的是什么node.在测试我的BST时,它似乎工作正常,没有错误/内存泄漏.
我认为可能有用的"黑客"是制作另一个指针以增加其引用计数.这是一个适当的解决方案吗?
//increase reference to node->right by 1 so it doesn't get …Run Code Online (Sandbox Code Playgroud)