[hard]450. Delete Node in a BST

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

Solution:

It reminds me of my high school days. It's a very basic step in treap, and now I just need to remove the fix from treap. Super easy.


1) If x has no sons, just delete it. don't forget x <- NULL

2) if x has a son, delete x and replace x with its son

2) if x has two son, right rotate x and deleteNode(x -> right)

(I assume you know what is a rotate operation in treap)


Here is my code:


class Solution {
public:
    TreeNode* deleteNode(TreeNode*& x, int key) {
        if (x) {
            if (x -> val == key) {
                if (x -> left == NULL && x -> right == NULL) {
                    delete x;
                    x = NULL;
                } else if (x -> left == NULL) {
                    auto y = x -> right;
                    delete x; x = y;
                } else if (x -> right == NULL) {
                    auto y = x -> left;
                    delete x; x = y;
                } else {
                    auto y = x -> left;
                    x -> left = y -> right;
                    y -> right = x;
                    x = y;
                    deleteNode(x -> right, key);
                }
            } else if (x -> val > key)
                deleteNode(x -> left, key);
            else
                deleteNode(x -> right, key);
        }
        return x;
    }
};


Sure, I understand your question. To test the BST code, we can create a main.c file and write a code to insert the given elements into an empty tree. Here's an example code for the same: ``` #include <stdio.h> #include <stdlib.h> // Definition of Node for BST struct node { int data; struct node *left, *right; }; // Function to create a new node struct node *newNode(int item) { struct node *temp = (struct node *)malloc(sizeof(struct node)); temp->data = item; temp->left = temp->right = NULL; return temp; } // Function to insert a new node struct node* insert(struct node* node, int data) { // If the tree is empty, return a new node if (node == NULL) return newNode(data); // Otherwise, recur down the tree if (data < node->data) node->left = insert(node->left, data); else if (data > node->data) node->right = insert(node->right, data); // return the (unchanged) node pointer return node; } // Function to do inorder traversal of BST void inorder(struct node *root) { if (root != NULL) { inorder(root->left); printf("%d ", root->data); inorder(root->right); } } // Main Function int main() { struct node *root = NULL; int arr[] = {3, 1, 4, 6, 9, 2, 5, 7, 6, 10}; int n = sizeof(arr)/sizeof(arr[0]); for(int i=0; i<n; i++) { root = insert(root, arr[i]); } inorder(root); return 0; } ``` In the above code, we create a new node using 'newNode' function, and then, traverse through the tree using the 'insert' function to insert each element. We then do an inorder traversal of the BST using 'inorder' function to print the sorted order of the elements.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值