考虑三种情况:
1.要删除的是叶节点:直接删除,并在修改其父节点的指针为NULL。
2.要删除的节点只有一个孩子节点:将其父节点的指针指向要删除节点的孩子节点。
3.要删除的节点有左、右两棵子树:用另一节点替代被删除节点:右子树的最小元素或左子树
的最大元素。
完整代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
if( !root ) return NULL;
if( key<root->val ) root->left = deleteNode(root->left, key);
else if( key>root->val ) root->right = deleteNode(root->right, key);
else
{
if( !root->left || !root->right )
root = (root->left)? root->left: root->right;
else
{
TreeNode *current = root->right;