请看题
Example
思路
Medium类型的题目。要求删除节点,还好不是AVL树,不然每次删除还要平衡,更难写了。
此题的思路为一个完全体的if。
首先判断节点是否为空,如果为空直接返回其头。
后面跟着两个else if用来判断当前节点的值是否为小于或者大于目标要求我们删除的值。如果进入了这个else if,那么我们就更新其左/右节点的值。
在后面就是一个else了,根据前面的if,else if如果都不满足那么是不是只有一个可能?也就是当前节点的值是跟要求删除的值为一样的。
那么这里面就又进入了好几种情况的if,如果左右节点不为空,左右节点为空,左节点为空,右节点为空,根据这四种情况要编写四种对应的if条件。上代码
Code
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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| /** * 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: int findMin(TreeNode* root){ while(root->left) root=root->left; return root->val; } TreeNode* deleteNode(TreeNode* root, int key) { if(!root) { return root; }
else if(root-> val > key) { root->left = deleteNode(root->left, key); } else if(root->val < key) { root->right = deleteNode(root->right, key);
} else { if(!root->left && !root->right) { delete root; return nullptr; } if(!root->left && root->right) { return root->right; } else if(root->left && !root->right) { return root->left; } else { root->val= findMin(root->right); root->right = deleteNode(root->right, root->val); } } return root; } };
|
结束。