###### tags: `LeetCode` `BST` `Recursion` `Medium`
# LeetCode #450 [Delete Node in a BST](https://leetcode.com/problems/delete-node-in-a-bst/)
### (Medium)
給定一個二叉搜索樹的根節點 root 和一個值 key,刪除二叉搜索樹中的 key 對應的節點,並保證二叉搜索樹的性質不變。返回二叉搜索樹(有可能被更新)的根節點的引用。
一般來說,刪除節點可分為兩個步驟:
* 首先找到需要刪除的節點;
* 如果找到了,刪除它。
---
方法為將該節點在整個樹中的的右邊節點(中序遍歷時在該節點右邊的的節點, 右子樹中的最左節點)的值與目標值對換, 然後刪掉該節點(該節點必定為葉節點, 可以直接刪除)。(找最靠近目標節點的最左節點也可以)
而因為兩值交換後目標節點會變成最底層的葉節點. 因此還是要遞迴呼叫刪除節點, 直到找到位置在葉節點的該節點, 並將其改為nullptr。
---
```
/**
* 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)return nullptr;
if(root->val==key){
if(!root->right)return root->left;
TreeNode* node = root->right;
while(node->left)node=node->left;
swap(root->val, node->val);
root->right=deleteNode(root->right, key);
return root;
}
//下兩行目標為尋找該節點
if(root->val<key)root->right = deleteNode(root->right, key);
else if(root->val>key)root->left = deleteNode(root->left, key);
return root;
}
};
```