1. 题目描述
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
示例:
输入:
1
\
3
/
2
输出: 1
解释:
最小绝对差为 1,其中 2 和 1 的差的绝对值为 1(或者 2 和 3)
提示:
树中至少有 2 个节点。
本题与 783 https://leetcode-cn.com/problems/minimum-distance-between-bst-nodes/ 相同
2. 解题思路
看见二叉搜索树就要想到它的性质:中序遍历是升序序列。如此一来,得到的序列中肯定是相邻的两元素之差比较小,所以得到中序遍历的序列后,用一个新的数组保存相邻两元素之差,再求最小值即可。
3. 第一种写法
这种写法就是题解思路的复现,得到中序遍历后的序列 result 后,遍历该数组,将相邻两元素之差的绝对值保存至新数组 ans,最后求min(ans)
即可。但是运行时间不太可观,也可能是电脑太垃圾了,翻了一下别人的题解,发现其实不用新数组来保存相邻两元素之差的绝对值————见第二种写法。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def getMinimumDifference(self, root: TreeNode) -> int:
if not root:
return 0
stack = []
node = root
result = []
while stack or node:
while node:
stack.append(node)
node = node.left
node = stack.pop()
result.append(node.val)
node = node.right
ans = []
for i in range(1, len(result)):
ans.append(abs(result[i] - result[i - 1]))
return min(ans)
4. 第二种写法
可以初始化两个指针 pre 和 cur,分别指向前一个节点和当前节点;再初始化一个最小值minimum(初始化为无穷大),然后比较 minimum 和 cur-pre 哪个更小,就把那个更小的值赋给minimum(minimum = min(minimum, cur - pre)
),比较完之后将 pre 指向 cur 所指的节点,cur 再去获取下一个节点……直到循环退出,返回最小值即可。
Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def getMinimumDifference(self, root: TreeNode) -> int:
if not root:
return 0
stack = []
node = root
pre = float('-inf')
minimum = float('inf')
while stack or node:
while node:
stack.append(node)
node = node.left
node = stack.pop()
cur = node.val
minimum = min(minimum, cur - pre)
pre = cur
node = node.right
return minimum