Leetcode---530/783二叉搜索树节点的最小绝对差+121.买卖股票的最佳时机

二叉搜索树节点的最小绝对值

Leetcode---530/783二叉搜索树节点的最小绝对差+121.买卖股票的最佳时机_第1张图片

解题思路–自己的笨方法

emmm,因为好久没有接触数据结构了,所以对二叉树的相关知识都遗忘的差不多了,只能用笨方法来解题,后面贴一个简单一些的方法。
思路是通过对二叉树进行遍历(只要是遍历就行,所以没有用到二叉树的性质),使用优先队列进行存储(按大小顺序进行存储可以省去很多麻烦,这样的话只要比较相邻元素即可,后来发现二叉搜索树在中序遍历时,是有序的。。。下面的代码会用上这一特点),最后把有限队列的元素依次输出,依次比较两者之间的差值大小,最后输出最小值。

代码

class Solution {
    public int minDiffInBST(TreeNode root) {
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        preViewNode(root, pq);
        int result ;
        int min = 100000; 
        while(pq.size()>1){
            result = pq.poll();
            min = Math.min(min, (pq.peek()-result));
        }
        return min;
    }
    public void preViewNode(TreeNode root, PriorityQueue<Integer> pq)
    {
        if(root != null)
        {
            pq.offer(root.val);
            preViewNode(root.left, pq);
            preViewNode(root.right, pq);
        }
        
    }
}

解题思路–利用二叉搜索树中序遍历有序的特点

因为二叉搜索树在进行中序遍历时是有序的,所以每次只要得到根节点和其子节点的差值,然后与当前的最小差值进行比较就可以了。,第一次遍历时,要存储当前的根节点值,所以使用sign进行标记。

代码

class Solution {
    int min,sign;
    public int minDiffInBST(TreeNode root) {
        min=100001;
        sign=-1;        
        midViewNode(root);

        return min;
    }
    public void midViewNode(TreeNode root)
    {
        if(root == null)
            return;
        midViewNode(root.left);
        if(sign==-1)
        {
            sign=root.val;
        }
        else{
            min = Math.min(min, root.val-sign);
            sign = root.val;
        }
        midViewNode(root.right);
    }
}

买卖股票的最佳时机

Leetcode---530/783二叉搜索树节点的最小绝对差+121.买卖股票的最佳时机_第2张图片

解题思路

因为最佳的时机就是最低点买入,最高点卖出,且要按照时间的顺序。所以在一次遍历中,分别存储当前的最小值min和当前的最大收益值max,如果当前遍历元素的值price[i]大于最小值min,则将其与最小值的差值price[i]-min与当前最大收益值max进行比较,从而决定是否更新最大收益值max,最后输出最大收益值max即可。

代码

class Solution {
    public int maxProfit(int[] prices) {
        int length = prices.length;
        int min=prices[0];
        int max = 0;
        for(int i=1;i<length;i++)
        {
            if(prices[i]>min)
            {
                max = Math.max( max, (prices[i] - min));
            }
            else{
                min = prices[i];
            }
        }
        return max;
    }
}

你可能感兴趣的:(Java学习,Leetcode每日一题,java,二叉树,leetcode)