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 };