void PhoneBook::deletePhoneNumberBST(BSTNode*& root, const string& name) { if (root == nullptr) { return; } if (name < root->data.name) { deletePhoneNumberBST(root->left, name); } else if (name > root->data.name) { deletePhoneNumberBST(root->right, name); } else { if (root->left == nullptr && root->right == nullptr) { delete root; root = nullptr; } else if (root->left == nullptr) { BSTNode* temp = root; root = root->right; delete temp; } else if (root->right == nullptr) { BSTNode* temp = root; root = root->left; delete temp; } else { BSTNode* minNode = findMinNode(root->right); root->data = minNode->data; deletePhoneNumberBST(root->right, minNode->data.name); } } }
时间: 2024-04-15 09:25:15 浏览: 86
电话号码管理程序
这段代码是一个二叉搜索树的删除操作。它接受两个参数,一个是二叉搜索树的根节点指针 `root`,另一个是要删除的电话号码的名称 `name`。
代码首先检查根节点是否为空。如果为空,说明树为空,直接返回,不执行任何操作。
如果根节点不为空,则比较要删除的电话号码的名称与当前节点存储的电话号码名称的大小关系。
- 如果要删除的名称小于当前节点的名称,则递归调用 `deletePhoneNumberBST` 函数,并将当前节点的左子节点作为新的根节点,继续在左子树中删除电话号码。
- 如果要删除的名称大于当前节点的名称,则递归调用 `deletePhoneNumberBST` 函数,并将当前节点的右子节点作为新的根节点,继续在右子树中删除电话号码。
- 如果要删除的名称等于当前节点的名称,则执行以下操作:
- 如果当前节点没有左子节点和右子节点(即为叶子节点),则直接删除当前节点,并将根节点指针设为 nullptr。
- 如果当前节点没有左子节点,则将根节点指针指向当前节点的右子节点,并删除当前节点。
- 如果当前节点没有右子节点,则将根节点指针指向当前节点的左子节点,并删除当前节点。
- 如果当前节点既有左子节点又有右子节点,则找到当前节点右子树中的最小节点(即右子树中最左边的节点),将该节点的数据复制到当前节点,然后递归调用 `deletePhoneNumberBST` 函数,将当前节点的右子节点作为新的根节点,继续在右子树中删除该最小节点。
通过递归调用和条件判断,最终会找到要删除的电话号码并进行删除操作。请注意,删除操作涉及到节点的移动和内存释放,代码中使用了临时变量 `temp` 来保存需要删除的节点,并更新根节点指针或进行数据的复制操作。
阅读全文