Thursday, September 10, 2020

450. Delete Node in a BST ---------M

Given a root node reference of a BST and a key, delete the node with the given key in the BST. Return the root node reference (possibly updated) of the BST.

Basically, the deletion can be divided into two stages:

  1. Search for a node to remove.
  2. If the node is found, delete the node.

Follow up: Can you solve it with time complexity O(height of tree)?

 

Example 1:

Input: root = [5,3,6,2,4,null,7], key = 3
Output: [5,4,6,2,null,null,7]
Explanation: Given key to delete is 3. So we find the node with value 3 and delete it.
One valid answer is [5,4,6,2,null,null,7], shown in the above BST.
Please notice that another valid answer is [5,2,6,null,4,null,7] and it's also accepted.

Example 2:

Input: root = [5,3,6,2,4,null,7], key = 0
Output: [5,3,6,2,4,null,7]
Explanation: The tree does not contain a node with value = 0.

Example 3:

Input: root = [], key = 0
Output: []

 

Constraints:

  • The number of nodes in the tree is in the range [0, 104].
  • -105 <= Node.val <= 105
  • Each node has a unique value.
  • root is a valid binary search tree.
  • -105 <= key <= 105

 A:

就是个实现题。考的是细心。

/**
 * 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:
    TreeNode* deleteNode(TreeNode* root, int key) {
        TreeNode header;
        header.left = root;
        TreeNode * pre = &header;
        TreeNode * cur = root;
        bool preLeft = true;
        while(cur!= nullptr && cur->val != key){
            if(cur->val <key){
                preLeft = false;
                pre = cur;
                cur = cur->right;
            }else{
                preLeft = true;
                pre = cur;
                cur = cur->left;
            }
        }
        if(cur!= nullptr){
            if(cur->left== nullptr){
                if(preLeft)
                    pre->left = cur->right;
                else
                    pre->right = cur->right;
            }else if(cur->right == nullptr){                
                if(preLeft)
                    pre->left = cur->left;
                else
                    pre->right = cur->left;
            }else{ // have two children
                // find the biggest on left children, and detach
                auto p = cur;
                auto child = cur->left;
                while(child->right){
                    p = child;
                    child = child->right;
                }
                cur->val = child->val;
                if(p==cur){
                    p->left = child->left;  // ERROR made, had assigned nullptr
                }else{
                    p->right = child->left;
                }
            }
        }
        return header.left;
    }    
};

ERROR:

就是p->left的时候,以为到了最后一个了,child节点的左右都是Null了, 然而不是的。哎


No comments:

Post a Comment