您的位置:首页 > Web前端 > Node.js

lintcode:Remove Node in Binary Search Tree

2016-02-25 22:57 621 查看


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.

Have you met this question in a real interview?

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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: