87-删除二叉查找树的节点

给定一棵具有不同节点值的二叉查找树,删除树中与给定值相同的节点。如果树中没有相同值的节点,就不做任何处理。你应该保证处理之后的树仍是二叉查找树。

样例

给出如下二叉查找树:



删除节点3之后,你可以返回:



或者:

标签

二叉查找树 LintCode 版权所有

思路

若要删除一个BST的一个结点,需要考虑如下三种情况:

  1. 需要删除的节点下并没有其他子节点
  2. 需要删除的节点下有一个子节点(左或右)
  3. 需要删除的节点下有两个子节点(既左右节点都存在)

对这三种情况分别采取的措施是:

  1. 直接删除此结点
  2. 删除此结点,将此结点父节点连接到此结点左(右)子树
  3. 找出此结点右子树中的最小结点,用以代替要删除的结点,然后删除此最小结点

code

/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @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;
} if(root->val > value) {
root->left = removeNode(root->left, value);
}
else if(root->val < value) {
root->right = removeNode(root->right, value);
}
else {
if (root->left == NULL || root->right == NULL) {
root = (root->left != NULL) ? root->left : root->right;
}
else {
TreeNode *cur = root->right;
while (cur->left != NULL) {
cur = cur->left;
}
root->val = cur->val;
root->right = removeNode(root->right, cur->val);
}
}
return root;
}
};

最新文章

  1. JS身份证号码校验
  2. 用.net在画出镂空图片
  3. 每天一命令 git reset
  4. 数据库对象映射为java对象,不使用框架
  5. HDU2028 Lowest Common Multiple Plus
  6. Sublime-text markdown with Vim mode and auto preview
  7. God of War - HDU 2809(状态压缩+模拟)
  8. 【转载】ASP.NET线程安全与静态变量的生命周期浅谈
  9. Eat Candy(暴力,水)
  10. Apache Spark 2.2.0 中文文档 - Submitting Applications | ApacheCN
  11. Echarts数据可视化series-radar雷达图,开发全解+完美注释
  12. DOM4J生成、解析XML实例
  13. vue入坑教程(一)
  14. spring boot mybatis打印SQL语句
  15. linux各文件夹含义和作用
  16. H3C_IRF_BFD配置
  17. exec函数族
  18. Linux 中 FQDN 查询及设置
  19. 《转》python学习(10)-集合
  20. golang web框架 beego 学习 (二) router and controller

热门文章

  1. springboot+mybatisplus 测试代码生成
  2. poj 2763 Housewife Wind : 树链剖分维护边 O(nlogn)建树 O((logn)&#178;)修改与查询
  3. ABAP术语-BAPI Explorer
  4. 解决 Android sdk content loader 0%
  5. weex踩坑记录
  6. docker化安装grafana
  7. php GD 圆图 -处理成圆图片
  8. 一个 mr 作业跑的比较慢,如何来优化。
  9. 解决pycharm报错:AttributeError: module &#39;pip&#39; has no attribute &#39;main&#39;
  10. python函数的返回值