二叉排序树的删除算法c++
时间: 2023-07-23 21:09:01 浏览: 105
二叉排序树的删除算法可以分为以下几个步骤:
1. 在二叉排序树中查找要删除的节点;
2. 如果节点不存在,则结束删除操作;
3. 如果节点存在且没有左右子树,则直接删除该节点;
4. 如果节点存在且有左子树或右子树,则用该节点的左子树或右子树代替该节点;
5. 如果节点存在且既有左子树又有右子树,则找到该节点右子树中的最小节点(或左子树中的最大节点),用该节点代替要删除的节点,并删除该最小节点(或最大节点)。
以下是二叉排序树的删除算法的C++实现代码:
```c++
// 定义二叉排序树节点结构体
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int v): val(v), left(nullptr), right(nullptr) {}
};
// 查找二叉排序树中的节点
TreeNode* search(TreeNode* root, int val) {
if (!root) return nullptr;
if (root->val == val) return root;
if (root->val > val) return search(root->left, val);
else return search(root->right, val);
}
// 删除二叉排序树中的节点
TreeNode* deleteNode(TreeNode* root, int val) {
if (!root) return nullptr;
if (root->val == val) {
if (!root->left && !root->right) return nullptr;
if (!root->left) return root->right;
if (!root->right) return root->left;
TreeNode* node = root->right;
while (node->left) node = node->left;
root->val = node->val;
root->right = deleteNode(root->right, node->val);
return root;
}
if (root->val > val) root->left = deleteNode(root->left, val);
else root->right = deleteNode(root->right, val);
return root;
}
```
注意:该实现代码中没有考虑节点内存释放的问题,使用时需要注意内存泄漏的情况。
阅读全文