二叉树删除节点的算法
二叉树删除节点的算法可以分为以下几步:
-
首先,需要找到要删除的节点。对于二叉搜索树(Binary Search Tree),可以使用二叉树的查找算法找到要删除的节点;对于普通的二叉树,需要遍历整个树,找到要删除的节点。
-
找到要删除的节点后,需要考虑三种情况:
- 如果要删除的节点是叶子节点(没有左右子节点),直接删除即可。
- 如果要删除的节点只有一个子节点,将子节点接到要删除节点的父节点上,并删除要删除节点。
- 如果要删除的节点有两个子节点,可以选择以下两种方法:
- 方法一:找到要删除节点的右子树中的最小节点,将其值替换到要删除节点中,并递归删除右子树中的最小节点。
- 方法二:找到要删除节点的左子树中的最大节点,将其值替换到要删除节点中,并递归删除左子树中的最大节点。
-
删除节点后,需要更新二叉树的结构,即将删除节点的父节点的指针指向正确的子节点。
下面是一个示例代码,实现了二叉树删除节点的算法(以二叉搜索树为例):
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def deleteNode(root, key):
if root is None: # 当前节点为空,返回None
return None
if key < root.val: # key小于当前节点的值,递归删除左子树中的节点
root.left = deleteNode(root.left, key)
elif key > root.val: # key大于当前节点的值,递归删除右子树中的节点
root.right = deleteNode(root.right, key)
else: # 当前节点的值等于key,需要删除当前节点
if root.left is None: # 当前节点只有右子树,将右子树接到当前节点的父节点
return root.right
elif root.right is None: # 当前节点只有左子树,将左子树接到当前节点的父节点
return root.left
else: # 当前节点既有左子树又有右子树
# 找到当前节点右子树中的最小节点,并将其值替换到当前节点中
min_node = findMin(root.right)
root.val = min_node.val
# 递归删除右子树中的最小节点
root.right = deleteNode(root.right, min_node.val)
return root
def findMin(node):
while node.left:
node = node.left
return node
这个算法的时间复杂度为O(logn)(当二叉树为平衡二叉树时),其中n为二叉树的节点数
原文地址: http://www.cveoy.top/t/topic/iOdX 著作权归作者所有。请勿转载和采集!