LeetCode 450
Delete Node in a BST
Problem Description:
删除二叉搜索树指定节点。
具体的题目信息:
https://leetcode.com/problems/delete-node-in-a-bst/description/- Solution:
- 解题思路:
(1)如果要删除的节点是叶子节点,只需修改父节点指针指向
(2)如果要删除的节点只有左/右子树,将父节点指针指向该要删除节点的左/右子树
(3)如果要删除的节点有左子树和右子树,遍历左子树得到最大节点值,用该值覆盖要删除节点值。 - 编程实现:
- 解题思路:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if (root == NULL) return root;
TreeNode* pre = NULL;
TreeNode* cur = root;
//cur指向要删除的节点(如果存在),pre指向父节点
while(cur && cur->val != key) {
if (cur->val < key) {
pre = cur;
cur = cur->right;
} else {
pre = cur;
cur = cur->left;
}
}
//若要删除的节点不存在
if (cur == NULL) return root;
//若要删除的结点是叶子节点,只需改变父节点的指向
if (cur->left == NULL && cur->right == NULL) {
//若要删除的节点是根节点
if (cur == root) {
root = NULL;
} else {
if (pre->left == cur)
pre->left = NULL;
else
pre->right = NULL;
}
free(cur);
} else if (cur->left && cur->right == NULL) {
//若要删除的节点只有左子树
if (cur == root) {
root = cur->left;
} else {
if (pre->left == cur)
pre->left = cur->left;
else
pre->right = cur->left;
}
free(cur);
} else if (cur->right && cur->left == NULL) {
//若要删除的节点只有右子树
if (cur == root) {
root = cur->right;
} else {
if (pre->left == cur)
pre->left = cur->right;
else
pre->right = cur->right;
}
free(cur);
} else {
//若要删除的节点既有左子树也有右子树
TreeNode* p = cur;
TreeNode* s = cur->left;
while(s->right) {
p = s;
s = s->right;
}
//s指向左子树中最大节点值
cur->val = s->val;
//若要删除节点的左子树中最大值出现在该左子树的根节点
if (p == cur)
p->left = s->left;
else
p->right = s->left;
}
return root;
}
};