LC.783 | 二叉搜索树节点最小距离 | 树 | 中序遍历有序性

输入: 二叉搜索树的根节点 root

要求: 计算树中任意两个不同节点值之间的最小差值。

输出: 一个整数,表示最小差值。


思路:

这道题如果是一棵普通的二叉树,我们需要把所有节点值存下来,两两比较,复杂度是 O(N^2)。但因为它是 二叉搜索树 (BST),我们可以利用其特性将问题极大简化。

  1. 核心转化:BST -> 有序数组
    • 二叉搜索树的中序遍历结果是一个 单调递增的有序数组
    • 在一个有序数组中,最小的差值一定出现在相邻的两个数之间
    • 例如:[1, 4, 7, 9]。差值只可能产生在 4-1, 7-4, 9-7 之间,绝对不可能产生在 9-1 之间。
  2. 优化空间:双指针思维
    • 我们不需要真的开辟一个数组把所有数存下来(那样空间复杂度是 O(N))。
    • 我们在遍历过程中,只需要知道 “上一个遍历到的节点值” (lastprev) 是多少。
    • 当前节点值 root->val 减去上一个节点值 last,就是当前的相邻差值。我们不断更新这个差值的最小值即可。
  3. 处理细节:
    • 我们需要一个变量 last 来记录上一个节点的值。初始化为 -1(或者一个不可能的负数),表示这是第一个节点,还没上家,不计算差值。

复杂度:

  • 时间复杂度:O(N)
    • 需要中序遍历整棵树。
  • 空间复杂度:O(H)
    • H 为树的高度,主要是递归栈的空间。

class Solution {
public:
    void inorder(TreeNode* root, int& ans, int& last) {
        if (!root) {
            return;
        }
        
        // 1. 递归左子树
        inorder(root->left, ans, last);
        
        // 2. 处理当前节点(中序位置)
        if (last == -1) {
            // 如果是第一个节点,只需更新 last,没法计算差值
            last = root->val;
        }
        else {
            // 计算当前节点与上一个节点的差值,并更新最小值
            // 因为是中序遍历,root->val 一定大于 last,所以不用 abs 也行
            ans = min(abs(root->val - last), ans);
            // 更新 last 为当前节点,供下一次使用
            last = root->val;
        }
        
        // 3. 递归右子树
        inorder(root->right, ans, last);
    }

    int minDiffInBST(TreeNode* root) {
        int ans = INT_MAX;
        int last = -1; // 用于记录中序遍历中的“上一个”节点值
        inorder(root, ans, last);
        return ans;      
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值