[ 二叉树 ] 删除搜索二叉树中的结点
程序员文章站
2022-05-16 11:25:55
...
450. 删除二叉搜索树中的节点 - 力扣(LeetCode) (leetcode-cn.com)
删除搜索二叉树中的结点
递归
- 没有孩子,直接删除
- 没左树,右树补;没右树,左树补
- 左右树都存在,左树补到右树最左结点的左边; 或右树补到左树最右结点的右边
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if (!root) return nullptr;
// 寻找删除点
if (root->val > key) root->left = deleteNode(root->left, key);
else if (root->val < key) root->right = deleteNode(root->right, key);
else {
// 没有孩子,直接删除
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;
//node->left = root->left;
//root = root->right;
// 或右树补到左树最右结点的右边
TreeNode* node = root->left;
while (node->right) node = node->right;
node->right = root->right;
root = root->left;
}
return root;
}
};
非递归
class Solution {
public:
// 同递归的删除逻辑
TreeNode* deleteOneNode(TreeNode* node) {
if (!node || (!node->right && !node->left)) return nullptr;
if (!node->left) return node->right;
if (!node->right) return node->left;
TreeNode* tmp = node->right;
while (tmp->left) tmp = tmp->left;
tmp->left = node->left;
return node->right;
}
TreeNode* deleteNode(TreeNode* root, int key) {
if (!root) return nullptr;
// 如果删除的是根结点,没有父结点,则直接返回删除后的结果
if (root->val == key) return deleteOneNode(root);
TreeNode* cur = root;
TreeNode* parent = nullptr;
while (cur) {
if (cur->val == key) break;
parent = cur;
if (cur->val > key) cur = cur->left;
else cur = cur->right;
}
// 判断删除的点是左子树还是右子树,方便重接
if (parent->left && parent->left->val == key) parent->left = deleteOneNode(cur);
if (parent->right && parent->right->val == key) parent->right = deleteOneNode(cur);
return root;
}
};
上一篇: 二叉搜索树的创建、插入、遍历、删除
下一篇: [ 二叉树 ] 二叉搜索树中的插入操作