二叉搜索树的最小绝对差(LeetCode)

题目链接

题目描述

给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。

示例:

输入:

   1
    \
     3
    /
   2

输出:
1

解释:
最小绝对差为 1,其中 2 和 1 的差的绝对值为 1(或者 2 和 3)。

思路

因为是一颗二叉搜索树,显然我们可以通过中序遍历得到递增序列,又因为对升序数组求任意两个元素之差的绝对值的最小值,答案一定为相邻两个元素之差的最小值,因此我们可以采用中序遍历并计算遍历时相邻结点的差来不断更新答案。

具体实现的时候需要使用一个变量pre来保存前面一个遍历过的结点,同时考虑到pre结点有可能出现在当前结点的左子树,因此需要使用引用,从而保证回溯时依然能得到处于左子树中的pre结点。

代码如下:

class Solution {
public:
    int ans;
    void dfs(TreeNode* &pre,TreeNode *now){
        if(now==NULL)
            return;
        else{
            dfs(pre,now->left);
            if(pre)
                ans=min(abs(pre->val-now->val),ans);
            pre=now;
            dfs(pre,now->right);
        }
    }
    int getMinimumDifference(TreeNode* root) {
        ans=1<<30;
        TreeNode *tmp=NULL;
        dfs(tmp,root);
        return ans;
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值