思路:

(1)如果root为空,返回

(2)如果当前结点root是待删除结点:

a:root是叶子结点,直接删去即可

    b:root左子树不为空,则找到左子树的最大值,即前驱结点,使用前驱结点代替待删除的root结点值,并在root的左子树中,继续删除前驱结点

    c:root右子树不为空,则找到右子树的最大值,即后继结点,使用后继结点代替待删除的root结点值,并在root的右子树中,继续删除后继结点

(3)如果待删除值大于root->val,则在右子树中继续删除待删除值

(4)如果待删除值小于root->val,则在左子树中继续删除待删除值

void deleteTreeNode(TreeNode* &root,int key)//使用引用,以可以直接改变原树的结点
{
if(root==NULL) return;
if(root->val==key)
{
if(!root->left && !root->right)
{
root=NULL;
}
else if(root->left)//左子树不空就优先左子树吧
{
//找左子树的最大元素,,即找到前驱结点
TreeNode* cur=root->left;
while(cur->right)
cur=cur->right;
root->val=cur->val;//使用前驱结点覆盖目标结点,并在目标结点的左子树中删除前驱结点
deleteTreeNode(root->left,cur->val);
}
else if(root->right)//右子树不空就优先左子树吧
{
//找右子树的最大元素,,即找到后继结点
TreeNode* cur=root->right;
while(cur->left)
cur=cur->left;
root->val=cur->val;//使用后继结点覆盖目标结点,并在目标结点的右子树中删除后继结点
deleteTreeNode(root->right,cur->val);
}
}
else if(key < root->val)
{
deleteTreeNode(root->left,key);
}
else if(key > root->val)
{
deleteTreeNode(root->right,key);
}
}

要注意,上面递归的过程中使用的是root的引用,因为是要直接删除结点,而不是改变结点中的值。

最新文章

  1. TCP和UDP的区别
  2. Nginx学习笔记(六) 源码分析&amp;启动过程
  3. [AngularJS + Webpack] Using Webpack for angularjs
  4. 中文乱码 $dbh-&gt;do(&quot;SET NAMES utf8&quot;);
  5. 2016年9月ccf
  6. struts2中&lt;s:select/&gt;标签的运用详解
  7. IE8下的项目在IE11下某些功能无法实现的问题
  8. ASP.NET跨平台
  9. Java线程安全 关于原子性与volatile的试验
  10. Maven学习-简介、安装
  11. [js高手之路]node js系列课程-图解express+supervisor+ejs用法
  12. MS SQL Server 2008 R2 常规操作
  13. 云服务器挂载/dev/vdb1磁盘
  14. BZOJ2961 共点圆[CDQ分治]
  15. django 补充和中间件
  16. Angular4 Ng 模块
  17. 如何更新clob类型的内容
  18. odoo开发笔记:前端显示强制换行
  19. Hive实现从表中随机抽样得到一个不重复的数据样本
  20. 生成式对抗网络GAN 的研究进展与展望

热门文章

  1. Docker Compose安装Registry后配置WebUI与客户端
  2. html5的 history模式和hash模式
  3. ElementUi中el-table分页效果
  4. 【计算机网络】ISO/OSI 网络体系结构
  5. MySQL 学习笔记 (一)
  6. 【洛谷5644】[PKUWC2018] 猎人杀(容斥+生成函数+分治NTT)
  7. [译]Vulkan教程(16)图形管道基础之总结
  8. C语言程序设计100例之(23):数列求和
  9. IT兄弟连 HTML5教程 CSS3揭秘 CSS常见的样式属性和值2
  10. C++入门到理解阶段二基础篇(9)——C++结构体