给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。
tips : 递归,删除该位置节点后,要用前驱/后继来替代,然后再递归删除节点。
class Solution {
public:
int preNode(TreeNode* node) {
if(node == NULL || node ->left == NULL) {
return -1;
}
node = node->left;
while (node->right != NULL)
{
node = node->right;
}
return node->val;
}
int nextNode(TreeNode* node) {
if(node == NULL || node ->right == NULL) {
return -1;
}
node = node->right;
while (node->left != NULL)
{
node = node->left;
}
return node->val;
}
TreeNode* deleteNode(TreeNode* root, int key) {
if(root == NULL) {
return NULL;
}
if(root->val == key) {
if(root->left == NULL && root->right == NULL) {
root = NULL;
} else if(root->left != NULL) {
root->val = preNode(root);
root->left = deleteNode(root->left, root->val);
} else {
root->val = nextNode(root);
root->right = deleteNode(root->right, root->val);
}
} else if(root->val > key) {
root->left = deleteNode(root->left, key);
} else {
root->right = deleteNode(root->right, key);
}
return root;
}
};