530,二叉搜索树的最小绝对差
题目描述
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
算法思路
递归
有思路就好办。
考虑到对二叉搜索树宝具:中序遍历,计算所有差值,更新最小值即可。
class Solution:
pre='K'
MIN=float('inf')
def getMinimumDifference(self, root: TreeNode) -> int:
if not root:return
self.getMinimumDifference(root.left)
if self.pre=='K':
self.pre=root.val
else:
self.MIN=min(root.val-self.pre,self.MIN)
self.pre=root.val
self.getMinimumDifference(root.right)
return self.MIN
这里是将遍历pre和MIN从递归中独立出来。
执行用时 :60 ms, 在所有 Python3 提交中击败了75.28%的用户
内存消耗 :15.6 MB, 在所有 Python3 提交中击败了21.64%的用户
版本2:
class Solution:
pre=-1
MIN=float('inf')
def getMinimumDifference(self,root: TreeNode ) -> int:
def inorder(root):
if not root:return
inorder(root.left)
if self.pre>-1:self.MIN=min(root.val-self.pre,self.MIN)
self.pre=root.val
inorder(root.right)
inorder(root)
return self.MIN
版本3:
def minDiffInBST(self, root: TreeNode) -> int:
def dfs(node):
if node:
dfs(node.left)
self.ans = min(self.ans, node.val - self.prev)
self.prev = node.val
dfs(node.right)
self.prev = float('-inf')
self.ans = float('inf')
dfs(root)
return self.ans
迭代
class Solution:
def getMinimumDifference(self, root: TreeNode) -> int:
stack=[]
pre=float('-inf')
mindif=float('inf')
while stack or root:
while root:
stack.append(root)
root=root.left
root=stack.pop()
cur=root.val
mindif=min(mindif,cur-pre)
pre=cur
root=root.right
return mindif
执行用时 :56 ms, 在所有 Python3 提交中击败了88.75%的用户
内存消耗 :15.5 MB,在所有 Python3 提交中击败了21.64%的用户