问题描述:
Given a root node reference of a BST and a key, delete the node with the given key in the BST. Return the root node reference (possibly updated) of the BST.
Basically, the deletion can be divided into two stages:
- Search for a node to remove.
- If the node is found, delete the node.
Note: Time complexity should be O(height of tree).
示例:
root = [5,3,6,2,4,null,7] key = 3 5 / \ 3 6 / \ \ 2 4 7 Given key to delete is 3. So we find the node with value 3 and delete it. One valid answer is [5,4,6,2,null,null,7], shown in the following BST. 5 / \ 4 6 / \ 2 7 Another valid answer is [5,2,6,null,4,null,7]. 5 / \ 2 6 \ \ 4 7
问题分析:
本题实质上还是一类二元搜索问题,关键在于最后如何处理被删除的结点及其子树。
过程详见代码:
/**
* 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) {
TreeNode pre(0);
pre.left = root;
bl(root, key, &pre, 0);
return pre.left;
}
void bl(TreeNode* root, int key, TreeNode* parent,int dict)
{
if (root == nullptr) return;
if (root->val == key)
{
if (root->left == nullptr && root->right == nullptr)
{
if (dict == 0) parent->left = nullptr;
else parent->right = nullptr;
}
else if (root->left && root->right == nullptr)
{
if (dict == 0) parent->left = root->left;
else parent->right = root->left;
}
else if (root->right && root->left == nullptr)
{
if (dict == 0) parent->left = root->right;
else parent->right = root->right;
}
else
{
TreeNode * t = root->left;
while (t->right)
{
t = t->right;
}
t->right = root->right;
if (dict == 0) parent->left = root->left;
else parent->right = root->left;
}
}
else if (root->val < key)
{
bl(root->right, key, root, 1);
}
else bl(root->left, key, root, 0);
}
};