lintcode:Remove Node in Binary Search Tree
2016-02-25 22:57
621 查看
Remove Node in Binary Search Tree
You have exceeded the time limitGiven 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; } };
相关文章推荐
- 学习node.js之stream
- nodejs npm常用命令
- HtmlAgilityPack 之 HtmlNode类
- [Lintcode]Remove Nth Node From End of List
- nw.js node-webkit系列(8)Native UI API MenuItem的使用
- 【转】 HTMLCollection和NodeList的区别
- nw.js node-webkit系列(7)Native UI API Menu的使用
- node 路由
- hadoop中namenode中的edit.log文件查看
- lintcode-easy-Insert Node in a Binary Search Tree
- ubuntu安装nodejs+pomelo+webstrom
- nw.js node-webkit系列(5)Native UI API Window的使用
- nodejs - 如何完全更新
- leetcode 24. Swap Nodes in Pairs
- ASP.NET Web Api vs Node.js Benchmark
- Node.js编写组件的三种实现方式
- 你所未知的3种Node.js代码优化方式
- hadoop2.6.4 搭建HA集群之后不能自动切换namenode
- leetcode:Populating Next Right Pointers in Each Node II
- 为Node.js编写组件的几种方式