返回
二叉搜索树的节点移除:简洁高效的「LeetCode」指南
前端
2024-02-17 10:32:02
简介
在「LeetCode」的众多题目中,450 题“删除二叉搜索树中的节点”可谓是经典之作,考验着程序员对二叉搜索树和递归算法的理解。本指南将以深入浅出的方式剖析这道题目,提供清晰易懂的解决方案,助你轻松掌握二叉搜索树节点删除的奥秘。
二叉搜索树的特性
二叉搜索树是一种特殊的有序二叉树,其特性如下:
- 左子树中的所有节点值都小于根节点值。
- 右子树中的所有节点值都大于根节点值。
- 左右子树本身也是二叉搜索树。
算法思路
二叉搜索树节点删除的算法思路主要基于以下原则:
- 递归查找: 从根节点开始,递归地查找要删除的节点。
- 找到后判断: 找到目标节点后,根据其子节点情况进行不同的处理。
- 更新父节点: 更新目标节点的父节点指向,以完成删除操作。
代码实现
以下是用 Python 实现的代码:
def deleteNode(root, key):
if not root:
return None
if key < root.val:
root.left = deleteNode(root.left, key)
elif key > root.val:
root.right = deleteNode(root.right, key)
else:
if not root.left:
return root.right
elif not root.right:
return root.left
# 找到左子树中最大的节点
max_node = root.left
while max_node.right:
max_node = max_node.right
# 将最大节点的值赋给当前节点
root.val = max_node.val
# 从左子树中删除最大节点
root.left = deleteNode(root.left, max_node.val)
return root
时间复杂度
该算法的时间复杂度为 O(h),其中 h 为二叉搜索树的高度。最坏情况下,树为退化树,此时高度为 n,时间复杂度为 O(n)。
示例
以一个示例二叉搜索树为例,删除值为 5 的节点:
10
/ \
5 15
/ \ / \
2 7 12 20
删除后,二叉搜索树变为:
10
/ \
2 15
/ \
12 20
总结
通过本文的讲解,相信你已经对二叉搜索树节点删除算法有了透彻的理解。掌握这一算法不仅能帮助你解决「LeetCode」450 题,更能加深你对二叉搜索树和递归算法的认识。在今后的编程实践中,这些知识将成为你不可或缺的利器。