783. 二叉搜索树节点最小距离
原始题目链接:https://leetcode-cn.com/problems/minimum-distance-between-bst-nodes/
给定一个二叉搜索树的根节点 root,返回树中任意两节点的差的最小值。
解题思路:
二叉搜索树,中序遍历是有序的序列。题目是要计算任意两点的最小距离,有序的序列相邻的节点的差值是最小的,所以在中序遍历二叉搜索树的同时,用一个变量每次统计记录最小值,最后保留下来的值就是答案。具体实现看代码及注释(按照个人习惯,可以将递归函数写成闭包函数,也可以写成类函数)。再强调一下,递归函数的三要素:
1)定义递归函数的功能
2)递归函数的结束条件
3)递归函数等价关系式
代码实现:
递归函数是类函数
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def __init__(self):
# 记录当前遍历节点的前一个节点
self.pre_node_val = float('-inf')
# 答案
self.ans = float('inf')
# 定义递归函数:中序遍历二叉搜索树,遍历的同时计算相邻元素的差值,每次进行比较保留 最小的差值,函数的参数是当前节点
# 递归函数结束条件:空节点,返回0
# 递归等价关系式:当前节点的左、右子树作为参数继续调用
def inorder_dfs(self, root):
if not root:
return 0
self.inorder_dfs(root.left)
self.ans = min(self.ans, root.val - self.pre_node_val)
self.pre_node_val = root.val
self.inorder_dfs(root.right)
def minDiffInBST(self, root: TreeNode) -> int:
self.inorder_dfs(root)
return self.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 minDiffInBST(self, root: TreeNode) -> int:
# 定义上一个节点,初始化为负无穷
self.prev_node = float('-inf')
# 定义答案,初始化为正无穷
self.ans = float('inf')
# 定义一个闭包函数,作用是中序遍历bst
def order(root):
if root:
# 递归遍历左子树
order(root.left)
# 更新逻辑
self.ans = min(self.ans, root.val - self.prev_node)
self.prev_node = root.val
# 递归遍历右子树
order(root.right)
order(root)
return self.ans
参考文献:
https://leetcode-cn.com/problems/minimum-distance-between-bst-nodes/solution/er-cha-sou-suo-shu-jie-dian-zui-xiao-ju-8u87w/