leetcode 530. Minimum Absolute Difference in BST(二叉搜索数中最小差的绝对值)

Given a binary search tree with non-negative values, find the minimum absolute difference between values of any two nodes.

Example:

Input:

   1
    \
     3
    /
   2

Output:
1

Explanation:
The minimum absolute difference is 1, which is the difference between 2 and 1 (or between 2 and 3).

找出二叉搜索树中两两节点间差的绝对值的最小值

思路:
二叉搜索树有个特点就是它的中序遍历值是升序的
相当于一个升序数组,两个值的最小差只能在相邻元素中产生
因为升序数组[a, b, c], 那么a < b < c, 那么c - a > b - a

可以中序遍历BST,把遍历过的节点值保存在数组中,然后数组依次两两元素求差取最小

   public int getMinimumDifference(TreeNode root) {
        List<Integer> nodes = new ArrayList<>();
        int diff = 0;
        midTraversal(root, nodes);
        
        diff = nodes.get(1) - nodes.get(0);
        
        for(int i = 2; i < nodes.size(); i++) {
            diff = Math.min(diff, nodes.get(i) - nodes.get(i-1));
        }
        return diff;
    }
    
    public void midTraversal(TreeNode root, List<Integer> nodes) {
        if(root == null) return;
        midTraversal(root.left, nodes);
        nodes.add(root.val);
        midTraversal(root.right, nodes);
    }

因为求差时只需要用到前一个值,因此可以每次访问到root时保存前一个的值,下次再求差的绝对值取最小
因为BST中值都是非负,所以pre的初始值可以取-1

class Solution {   
    int pre = -1;
    int diff = Integer.MAX_VALUE;
    public int getMinimumDifference(TreeNode root) {        
        midTraversal(root);      
        return diff;
    }
    
    public void midTraversal(TreeNode root) {
        if(root == null) return;
        midTraversal(root.left);
        if(pre != -1) {
            diff = Math.min(diff, Math.abs(root.val - pre));
        }
        pre = root.val;
        midTraversal(root.right);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值