删除二叉搜索树中的节点

给定一个二叉搜索树的根节点root和一个值key,删除二叉搜索树中的key对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

  1. 首先找到需要删除的节点;
  2. 如果找到了,删除它。

提示:

  • 节点数的范围$[0, 10^4]$.
  • $-10^5$ <= Node.val <= $10^5$
  • 节点值唯一
  • root是合法的二叉搜索树
  • $-10^5$ <= key <= $10^5$

450.删除二叉搜索树中的节点

这题目还假惺惺地告诉了你步骤

这题很明显地递归,如果你想看迭代的解法可以看这里,反正我是不会这么写的…

递归的思路很清晰,利用BST的性质即可:

  • 如果当前节点的值小于目标值,说明目标节点在右子树,往右子树递归
  • 如果当前节点的值大于目标值,说明目标节点在左子树,往左子树递归
  • 如果当前节点的值等于目标值,说明该节点为目标节点。如果该节点只有左子树或右子树,直接用非空子树替换即可。如果该节点左右子树都非空,将该节点的值替换为该节点的右子树中最小节点的值(一直往左子树找即可),往右子树递归,删除最小节点。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if(root == nullptr){
return root;
}
if(root->val < key){
root->right = deleteNode(root->right, key);
}else if(root->val > key){
root->left = deleteNode(root->left, key);
}else{
if(root->left == nullptr){
return root->right;
}else if(root->right == nullptr){
return root->left;
}else{
TreeNode* temp = root->right;
while(temp->left){
temp = temp->left;
}
root->val = temp->val;
root->right = deleteNode(root->right, temp->val);
}
}
return root;
}
};
Contents
|