本文最后更新于:2020年10月13日 上午

二叉搜索树的最小绝对差

给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。

思路

git config —global user.email “you@example.com”
git config —global user.name “Your Name”

对升序数组$a$求任意两个元素之差的绝对值的最小值,答案一定为相邻两个元素之差的最小值,即

其中$n$为数组$a$的长度。
二叉搜索树的性质:二叉搜索树中序遍历得到的值序列是递增有序的。因此只要得到中序遍历后的值序列就能使用上述方法求解。
朴素的方法:经过一次中序遍历后将值保存在一个数组中进行遍历求解。简易:在中序遍历的过程中用$pre$变量保存前驱节点的值,这样能边遍历边更新答案,一次遍历即可得到答案(无需保存数组和再次遍历)。需要注意 的是$pre$的初始值需要设置为任意负数标记开头,代码中设置为1。
二叉树的中序遍历有多种方式,包括递归、栈、Morris遍历等。

Code

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    ans = 999
    pre = -1
    def getMinimumDifference(self, root: TreeNode) -> int:
        def dfs(root):
            if root == None:
                return
            dfs(root.left)
            if self.pre == -1:
                self.pre = root.val
            else:
                self.ans = min(self.ans, abs(root.val - self.pre))
                self.pre = root.val
            dfs(root.right)
        dfs(root)
        return self.ans

复杂度分析

  • 时间复杂度:$O(n)$,其中$n$为二叉搜索树节点的个数。每个节点在中序遍历中都会访问一次且只会被访问一次,因此总时间复杂度为$O(n)$。
  • 空间复杂度:$O(n)$。递归函数的空间复杂度取决于递归的栈深度,而栈深度在二叉搜索树为一条链的情况下会达到$O(n)$的级别。

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

随笔-近来杂谈 上一篇
算法-查找 下一篇