返回

二叉搜索树的节点移除:简洁高效的「LeetCode」指南

前端

简介

在「LeetCode」的众多题目中,450 题“删除二叉搜索树中的节点”可谓是经典之作,考验着程序员对二叉搜索树和递归算法的理解。本指南将以深入浅出的方式剖析这道题目,提供清晰易懂的解决方案,助你轻松掌握二叉搜索树节点删除的奥秘。

二叉搜索树的特性

二叉搜索树是一种特殊的有序二叉树,其特性如下:

  • 左子树中的所有节点值都小于根节点值。
  • 右子树中的所有节点值都大于根节点值。
  • 左右子树本身也是二叉搜索树。

算法思路

二叉搜索树节点删除的算法思路主要基于以下原则:

  1. 递归查找: 从根节点开始,递归地查找要删除的节点。
  2. 找到后判断: 找到目标节点后,根据其子节点情况进行不同的处理。
  3. 更新父节点: 更新目标节点的父节点指向,以完成删除操作。

代码实现

以下是用 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 题,更能加深你对二叉搜索树和递归算法的认识。在今后的编程实践中,这些知识将成为你不可或缺的利器。