1 /**
2 * Definition for a binary tree node.
3 * struct TreeNode {
4 * int val;
5 * TreeNode *left;
6 * TreeNode *right;
7 * TreeNode() : val(0), left(nullptr), right(nullptr) {}
8 * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
9 * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
10 * };
11 */
12 class Solution {
13 public:
14 TreeNode* deleteNode(TreeNode* root, int key)
15 {
16 if(root == nullptr)
17 {
18 return nullptr;
19 }
20 if(key < root->val)//目标节点在左子树中,递归处理左子树,返回结果赋予root 左指针
21 {
22 root->left = deleteNode(root->left,key);
23 return root;
24 }
25 else if(key > root->val)//目标节点在右子树中,递归处理右子树,返回结果赋予root 右指针
26 {
27 root->right = deleteNode(root->right, key);
28 return root;
29 }
30 else //root 就是需要删除的目标节点
31 {
32 if(root->left == nullptr && root->right == nullptr) //root 是叶节点,删除root ,返回nullptr
33 {
34 delete root;
35 root = nullptr;
36 return root;
37 }
38 else if(root->left != nullptr && root->right == nullptr)//root只有左子树,删除root,返回左子树
39 {
40 TreeNode* leftNode = root->left;
41 delete root;
42 root = nullptr;
43 return leftNode;
44 }
45 else if(root->left == nullptr && root->right != nullptr)//root只有右子树,删除root,返回右子树
46 {
47 TreeNode* rightNode = root->right;
48 delete root;
49 root = nullptr;
50 return rightNode;
51 }
52 else //既有左子树又有右子树,将右子树上的最小值,覆盖掉root上的值,并删除掉右子树上的最小值节点,并将其再接到root->right上
53 {
54 TreeNode* pre = root->right;
55 while(pre->left)
56 {
57 pre = pre->left;
58 }
59 root->val = pre->val;
60 //将任务 “删除掉右子树上的最小值节点” 交给递归,并将递归得到的结果,再接到root->right上
61 root->right = deleteNode(root->right, pre->val);
62 return root;
63 }
64 }
65 return root;
66 }
67 };