代码随想录Day33

LeetCode530.二叉搜索树的最小绝对差

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

示例:

提示:树中至少有 2 个节点。

思路:由于是二叉搜索树,可以用中序遍历,把二叉树变成有序数组,进而问题转化为求有序数组的任意两节点的最小值。

既然是有序数组,那么任意两节点的最小值只能在相邻两节点之间产生。把输出的有序数组挨个比较即可。

 

代码:

复制代码
class Solution {
    TreeNode pre;// 记录上一个遍历的结点
    int result = Integer.MAX_VALUE;
    public int getMinimumDifference(TreeNode root) {
       if(root==null)return 0;
       traversal(root);
       return result;
    }
    public void traversal(TreeNode root){
        if(root==null)return;
        //
        traversal(root.left);
        //
        if(pre!=null){
            result = Math.min(result,root.val-pre.val);
        }
        pre = root;
        //
        traversal(root.right);
    }
}
复制代码

迭代法-中序遍历

 

 

 

复制代码
class Solution {
    TreeNode pre;
    Stack<TreeNode> stack;
    public int getMinimumDifference(TreeNode root) {
        if (root == null) return 0;
        stack = new Stack<>();
        TreeNode cur = root;
        int result = Integer.MAX_VALUE;
        while (cur != null || !stack.isEmpty()) {
            if (cur != null) {
                stack.push(cur); // 将访问的节点放进栈
                cur = cur.left; //
            }else {
                cur = stack.pop(); 
                if (pre != null) { //
                    result = Math.min(result, cur.val - pre.val);
                }
                pre = cur;
                cur = cur.right; //
            }
        }
        return result;
    }
}
复制代码

 

posted @   NobodyHero  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示