Delete Node in a BST
在二分查找树中删除一个给定值所在的节点,随后返回删除后二叉树的根节点。
解题思路:
利用二分查找树查找该节点key,key和当前根节点的value进行比较:
(1) 如果key
<
<
<script type="math/tex" id="MathJax-Element-64"><</script>value,说明要删除的节点在根节点的左子树上。
(2) 如果key
>
>
<script type="math/tex" id="MathJax-Element-65">></script>value,说明要删除的节点在根节点的右子树上。
(3) 如果key == value,表明要删除的节点就是当前根节点,按照如下情况讨论:
(1) 如果root中左子树为空,那么设置删除后二叉树的根节点为root的右子树;
(2) 如果root中右子树为空,那么设置删除后二叉树的根节点的root的左子树;
(3) 如果root中左右子树都不是空,有两种方法,用root的左子树中的最大值max代替root的值,然后删除root所在左子树上的max值,把返回的节点挂在root的左子树上。或者用root的右子树中的小值min代替root的值,然后删除root所在右子树上的min值,把返回的节点挂在右子树上。
具体代码如下:
class Solution {
public:
// find the max value's node
TreeNode* findMin(TreeNode* root){
while (root->right)
root = root->right;
return root;
}
TreeNode* deleteNode(TreeNode* root, int key) {
if (root == nullptr)
return nullptr;
if (key< root->val)
root->left = deleteNode(root->left, key);
else if (key>root->val)
root->right = deleteNode(root->right, key);
else
{
if (root->left == nullptr)
{
TreeNode* tmp = root;
root = root->right;
delete tmp;
}
else if (root->right == nullptr)
{
TreeNode* tmp = root;
root = root->left;
delete tmp;
}
else
{
// 寻找左子树上最大的节点
TreeNode* max Node = findMin(root->left);
root->val = minNode->val;
root->left = deleteNode(root->left, root->val);
}
}
return root;
}
};