lintcode:Remove Node in Binary Search Tree

504 篇文章 0 订阅
66 篇文章 0 订阅
                               Remove Node in Binary Search Tree
You have exceeded the time limit

Given a root of Binary Search Tree with unique value for each node. Remove the node with given value. If there is no such a node with given value in the binary search tree, do nothing. You should keep the tree still a binary search tree after removal.

Example

Given binary search tree:

    5
   / \
  3   6
 / \
2   4

Remove 3, you can either return:

    5
   / \
  2   6
   \
    4

or

    5
   / \
  4   6
 /
2
Tags Expand

Related Problems Expand 

/**
 * Definition of TreeNode:
 * class TreeNode {
 * public:
 *     int val;
 *     TreeNode *left, *right;
 *     TreeNode(int val) {
 *         this->val = val;
 *         this->left = this->right = NULL;
 *     }
 * }
 */
class Solution {
    
private:
    TreeNode * getPreNode(TreeNode* root)
    {
        TreeNode *curNode = root;
        while (curNode->right)
        {
            curNode = curNode->right;
        }
        
        return curNode;
    }
    
public:

    void removeNodeHelper(TreeNode* curNode,  int value) {
        
        if (curNode == NULL)
            return;
        
        if (curNode->left && curNode->left->val == value)
        {
            TreeNode *tmpNode = curNode->left;
            if (tmpNode->left != NULL && tmpNode->right == NULL)
                curNode->left = tmpNode->left;
            else if (tmpNode->left == NULL && tmpNode->right != NULL)
                curNode->left = tmpNode->right;
            else if (tmpNode->left == NULL && tmpNode->right == NULL)
                curNode->left = NULL;
            else
            {
                TreeNode *preNode = getPreNode(tmpNode->left);
                preNode->right = tmpNode->right->left;
                curNode->left = tmpNode->right;
                tmpNode->right->left = tmpNode->left;
            }
            return;
        }
        else if (curNode->right && curNode->right->val == value)
        {
            TreeNode *tmpNode = curNode->right;
            if (tmpNode->left != NULL && tmpNode->right == NULL)
                curNode->right = tmpNode->left;
            else if (tmpNode->left == NULL && tmpNode->right != NULL)
                curNode->right = tmpNode->right;
            else if (tmpNode->left == NULL && tmpNode->right == NULL)
                curNode->right = NULL;
            else
            {
                TreeNode *preNode = getPreNode(tmpNode->left);
                preNode->right = tmpNode->right->left;
                curNode->right = tmpNode->right;
                tmpNode->right->left = tmpNode->left;
            }
            return;
        }
        
        removeNodeHelper(curNode->left, value);
        removeNodeHelper(curNode->right, value);
    }

    /**
     * @param root: The root of the binary search tree.
     * @param value: Remove the node with given value.
     * @return: The root of the binary search tree after removal.
     */
    TreeNode* removeNode(TreeNode* root, int value) {
        // write your code here
        
        if (root == NULL)
            return NULL;
            
        TreeNode fakeHeader(INT_MAX);
        fakeHeader.left = root;
        
        removeNodeHelper(&fakeHeader, value);
        
        return fakeHeader.left;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值