返回

Python 实现:巧解二叉搜索树最小绝对差

见解分享

前言

LeetCode 0530. 二叉搜索树的最小绝对差 要求我们查找二叉搜索树(BST)中任意两个节点值之间的最小绝对差。BST 特性决定了其节点值的单调性,这为我们提供了解题的巧妙思路。

算法剖析

算法的关键在于利用 BST 的中序遍历 特点。由于 BST 中序遍历的顺序与节点值的升序排列一致,因此我们可以通过一次中序遍历,同时记录相邻节点值之间的差值,找到最小绝对差。

Python 实现

class Solution:
    def minDiffInBST(self, root):
        prev, min_diff = None, float('inf')

        def inorder(node):
            nonlocal prev, min_diff
            if not node:
                return

            inorder(node.left)

            if prev:
                min_diff = min(min_diff, node.val - prev)

            prev = node.val

            inorder(node.right)

        inorder(root)
        return min_diff

算法流程

  1. 初始化: 定义局部变量 prev 用于记录上一个访问的节点值,min_diff 用于存储最小绝对差。
  2. 中序遍历: 使用递归定义中序遍历函数 inorder,对 BST 进行中序遍历。
  3. 计算差值: 在中序遍历过程中,如果 prev 不为 None,则计算当前节点 node 与上一个节点 prev 之间的差值,并更新 min_diff 的值。
  4. 更新 prev 将当前节点 node 的值更新为 prev
  5. 遍历结束: 当中序遍历结束时,min_diff 即为二叉搜索树中任意两个节点值之间的最小绝对差。

代码示例

# 创建二叉搜索树
root = TreeNode(4)
root.left = TreeNode(2)
root.right = TreeNode(6)
root.left.left = TreeNode(1)
root.left.right = TreeNode(3)

# 调用函数求解最小绝对差
min_diff = Solution().minDiffInBST(root)
print(min_diff)  # 输出:1

结语

通过巧妙地利用 BST 的中序遍历特性,我们能够高效地求解最小绝对差。本 Python 实现清晰简洁,充分体现了算法的精髓。