给定一个二叉搜索树的根节点root和一个值key,删除二叉搜索树中的key对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
- 首先找到需要删除的节点;
- 如果找到了,删除它。
提示:
- 节点数的范围$[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
|
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; } };
|