llllmz

导航

450. 删除二叉搜索树中的节点c

这题特别好,和递归删除链表里的元素有异曲同工之妙

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
struct TreeNode* leftleave(struct TreeNode* root){
    root=root->left;
    while(root && root->right) root=root->right;
    return root;
}


struct TreeNode* deleteNode(struct TreeNode* root, int key){
    if(!root) return NULL;
    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){
            free(root);
            return NULL;
        }
        if(root->left){
            struct TreeNode* temp=leftleave(root);
            root->val=temp->val;
            root->left=deleteNode(root->left,temp->val);
        }else{
            struct TreeNode* temp=root;
            root=root->right;
            free(temp);
        }
    }
    return root;
}

结果:

posted on 2024-03-07 13:22  神奇的萝卜丝  阅读(15)  评论(0)    收藏  举报