二叉搜索树删除算法(非递归写法)
删除结点分4中情况:
- 无左右子节点,直接删除
- 有左子节点、无右子节点,将左子节点替换到删除结点处
- 有右子节点、无左子节点,将右子节点替换到删除结点处
- 有左有右, 选左子树最右结点 或 右子树最左结点替换
function deleteNode(root, key) {
if(root === null ) return root
let cur = root , pre = new TreeNode('a') ,sign = 'l'
pre.left = root
while(cur){
if(cur.val === key) break
else if(cur.val > key){
if(cur.left) {pre = cur ;sign = 'l'; cur = cur.left}
else return root
}
else{
if(cur.right) {pre = cur ; sign = 'r'; cur = cur.right}
else return root
}
}
if(!(cur.left || cur.right)){
// 无左 无右,直接删除
sign === 'l' ? pre.left = null : pre.right = null
return cur.val === root.val ? pre.left : root
}
if( cur.left && !cur.right){
// 有左 无右,左节点顶上来
sign === 'l' ? pre.left = cur.left : pre.right = cur.left
return cur.val === root.val ? pre.left : root
}
if(!cur.left && cur.right ){
// 无左 有右, 右节点顶上来
sign === 'l' ? pre.left = cur.right : pre.right = cur.right
return cur.val === root.val ? pre.left : root
}
if( cur.left && cur.right ){
// 有左有右, 选左子树最右结点 或 右子树最左结点替换
var tempPre = cur ,tsign = 'r'
var leftest = cur.right
while(leftest.left){
// 找到最左
tempPre = leftest
tsign = 'l'
leftest = leftest.left
}
if(leftest.right) {
tsign === 'l' ? tempPre.left = leftest.right : tempPre.right = leftest.right
}else tsign === 'l' ? tempPre.left = null : tempPre.right = null
leftest.left = cur.left
leftest.right = cur.right
sign === 'l' ? pre.left = leftest : pre.right = leftest
return cur.val === root.val ? pre.left : root
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人