微軟面試題: LeetCode 450 . 刪除二叉搜索樹中的節點 middle 出現次數:3

 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 };
相關文章
相關標籤/搜索