Leetcode450. 删除二叉搜索树中的节点
2024-08-30 11:13:07
思路:
(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的引用,因为是要直接删除结点,而不是改变结点中的值。
最新文章
- TCP和UDP的区别
- Nginx学习笔记(六) 源码分析&;启动过程
- [AngularJS + Webpack] Using Webpack for angularjs
- 中文乱码 $dbh->;do(";SET NAMES utf8";);
- 2016年9月ccf
- struts2中<;s:select/>;标签的运用详解
- IE8下的项目在IE11下某些功能无法实现的问题
- ASP.NET跨平台
- Java线程安全 关于原子性与volatile的试验
- Maven学习-简介、安装
- [js高手之路]node js系列课程-图解express+supervisor+ejs用法
- MS SQL Server 2008 R2 常规操作
- 云服务器挂载/dev/vdb1磁盘
- BZOJ2961 共点圆[CDQ分治]
- django 补充和中间件
- Angular4 Ng 模块
- 如何更新clob类型的内容
- odoo开发笔记:前端显示强制换行
- Hive实现从表中随机抽样得到一个不重复的数据样本
- 生成式对抗网络GAN 的研究进展与展望
热门文章
- Docker Compose安装Registry后配置WebUI与客户端
- html5的 history模式和hash模式
- ElementUi中el-table分页效果
- 【计算机网络】ISO/OSI 网络体系结构
- MySQL 学习笔记 (一)
- 【洛谷5644】[PKUWC2018] 猎人杀(容斥+生成函数+分治NTT)
- [译]Vulkan教程(16)图形管道基础之总结
- C语言程序设计100例之(23):数列求和
- IT兄弟连 HTML5教程 CSS3揭秘 CSS常见的样式属性和值2
- C++入门到理解阶段二基础篇(9)——C++结构体