783. 二叉搜索树节点最小距离

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值