lintcode:Remove Node in Binary Search Tree

来源:互联网 发布:三级域名申请 编辑:程序博客网 时间:2024/05/27 14:14

                               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;    }};


0 0
原创粉丝点击