zoukankan      html  css  js  c++  java
  • leetcode530 二叉搜索树的最小绝对差

    给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
     
    示例:
    输入:
       1
       
         3
        /
       2
    输出:
    1
    解释:
    最小绝对差为 1,其中 2 和 1 的差的绝对值为 1(或者 2 和 3)。
     
    思路:利用BST中序遍历的性质:中序遍历得到的是一个递增的序列,因此只要求相邻节点的最小值即可。
    需增加一个临时结点用以保存上次访问的结点(递归的临时变量需设置成全局变量)
    增加一个临时变量用以保存最小值
     
    我的代码
    	public int getMinimumDifference(TreeNode root) {
    		List<Integer> list = new ArrayList<Integer>();
    		minDiff(root, list);
    		Collections.sort(list);
    		int min = Integer.MAX_VALUE;
    		for (int i = 0; i < list.size() - 1; i++) {
    			min = Math.min(min, Math.abs(list.get(i) - list.get(i + 1)));
    		}
    		return min;
    	}
    
    	public void minDiff(TreeNode root, List<Integer> list) {
    
    		if (root == null) {
    			return;
    		}
    		list.add(root.val);
    		minDiff(root.left, list);
    		minDiff(root.right, list);
    	}
    

      参考答案

    	TreeNode pre = null;
    	int res = Integer.MAX_VALUE;
    
    	public int getMinimumDifference(TreeNode root) {
    		if (null == root) {
    			return 0;
    		}
    		inorder(root);
    		return res;
    	}
    
    	public void inorder(TreeNode root) {
    		if (root == null) {
    			return;
    		}
    		inorder(root.left);
    		if (null != pre) {
    //			res = Math.min(res, Math.abs(pre.val - root.val));
    			//为什么可以不用求绝对值? 因为中序遍历BST是递增序列
    			res = Math.min(res, Math.abs(root.val - pre.val));
    		}
    
    		pre = root;
    		inorder(root.right);
    	}
    

      

     
  • 相关阅读:
    闭包
    原型继承
    js时间戳转成日期格式
    常用正则表达式
    vue中如何实现pdf文件预览?
    Vue动画效果
    手把手教你封装 Vue 组件,并使用 npm 发布
    LCD驱动(FrameBuffer)实例开发讲解
    每个程序员都该阅读的书
    LCD platform_device(s5pv210)
  • 原文地址:https://www.cnblogs.com/lt123/p/13804067.html
Copyright © 2011-2022 走看看