• LC 450. Delete Node in a BST


    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.

    Note: Time complexity should be O(height of tree).

    Example:

    root = [5,3,6,2,4,null,7]
    key = 3
    
        5
       / 
      3   6
     /    
    2   4   7
    
    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 following BST.
    
        5
       / 
      4   6
     /     
    2       7
    
    Another valid answer is [5,2,6,null,4,null,7].
    
        5
       / 
      2   6
          
        4   7
    class Solution {
    public:
      TreeNode* deleteNode(TreeNode* root, int key) {
        if(!root) return root;
        TreeNode* ret;
        if(root->val == key) {
          TreeNode* rnode_lmost = getlm_or_rm_node(root->right, true);
          if(rnode_lmost) {
            rnode_lmost->left = root->left;
            ret = root->right;
          }else ret = root->left;
        }else {
          if(key < root->val) root->left = deleteNode(root->left, key);
          else root->right = deleteNode(root->right, key);
          ret = root;
        }
        return ret;
      }
      TreeNode* getlm_or_rm_node(TreeNode* root, bool left){
        if(!root) return root;
        if(left) {
          while(root->left) root = root->left;
        }else {
          while(root->right) root = root->right;
        }
        return root;
      }
    };
    class Solution {
    public:
        TreeNode *deleteNode(TreeNode *root, int key) {
            TreeNode **cur = &root;
    
            while (*cur && (*cur)->val != key)
                cur = (key > (*cur)->val) ? &(*cur)->right : &(*cur)->left;
    
            if (*cur) {
                if (!(*cur)->right) *cur = (*cur)->left;
                else {
                    TreeNode **successor = &(*cur)->right;
                    while ((*successor)->left) successor = &(*successor)->left;
                    swap((*cur)->val, (*successor)->val);
                    *successor = (*successor)->right ? (*successor)->right : nullptr;
                }
            }
            return root;
        }
    
    };
  • 相关阅读:
    November 13th 2016 Week 47th Sunday The 1st Day
    November 12th 2016 Week 46th Saturday
    November 11th 2016 Week 46th Friday
    November 10th 2016 Week 46th Thursday
    November 9th 2016 Week 46th Wednesday
    November 8th 2016 Week 46th Tuesday
    windows 7文件共享方法
    Win7无线网络共享设置方法
    常量指针和指针常量
    如何查找局域网的外网ip
  • 原文地址:https://www.cnblogs.com/ethanhong/p/10354389.html
Copyright © 2020-2023  润新知