day19

530 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
class Solution {
    TreeNode pre;
    int result = Integer.MAX_VALUE;
    public int getMinimumDifference(TreeNode root) {
        getMin(root);
        return result;
    }

    
    public void getMin(TreeNode root){
        if(root == null){
            return;
        }
        getMin(root.left);
        if(pre != null){
            result = Math.min(result,root.val - pre.val);
        }
        pre = root;
        getMin(root.right);
    }
}
501力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

本题我自己用了暴力解法:
 

class Solution {
    Map<Integer,Integer> map = new TreeMap<>();
        public int[] findMode(TreeNode root) {
            if(root == null){
                return new int[]{};
            }
            orderView(root);
            PriorityQueue<int[] > pq = new PriorityQueue<>(new Comparator<int[]>() {
                @Override
                public int compare(int[] o1, int[] o2) {
                    return o2[1] - o1[1];
                }
            });
            for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
                pq.offer(new int[]{entry.getKey(),entry.getValue()});
            }
            int peek = pq.peek()[1];
            ArrayList<Integer> list =new ArrayList<>();
            for(int i = 0;i<map.size();i++){
                int[] poll = pq.poll();
                if(poll[1] == peek){
                    list.add(poll[0]);
                }
            }
            int[] array = new int[list.size()];
            for(int i = 0;i<array.length;i++){
                array[i] = list.get(i);
            }
            return array;
        }
        public void orderView(TreeNode root){
            if(root == null)
                return;
            orderView(root.left);
            map.put(root.val,map.getOrDefault(root.val,0) + 1);
            orderView(root.right);
        }
    
}

中序遍历 —— 加到map中——转大顶堆——得到和peek()一样的值的数,非常繁琐

用随想录的方法:

class Solution {
    ArrayList<Integer> list = new ArrayList<>();
//记录每个数出现的次数
    int count = 0;
//记录最大数
    int countMax = 0;
//前一个结点
    TreeNode pre;
        public int[] findMode(TreeNode root) {
           orderView(root);
           int[] res = new int[list.size()];
           for(int i = 0; i < res.length; i++){
               res[i] = list.get(i);
           }
           return res;
        }
        public void orderView(TreeNode root){
           if(root == null){
               return;
           }
           findMode(root.left);
//pre == null 初始化count,
root.val != pre.val 上一个数在这颗二叉搜索树中已经没了,重新计数
           if(pre == null || root.val != pre.val){
               count = 1;
           }else{
               count++;
           }
//如果大于,则更新
           if(count > countMax){
               list.clear();
               list.add(root.val);
               countMax = count;
//小于则继续添加
           }else if(count == countMax){
               list.add(root.val);
           }
           pre = root;
           findMode(root.right);
        }
    
}
236.
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null || root == p || root == q) { // 递归结束条件
            return root;
        }

        // 后序遍历
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);

        if(left == null && right == null) { // 若未找到节点 p 或 q
            return null;
        }else if(left == null && right != null) { // 若找到一个节点
            return right;
        }else if(left != null && right == null) { // 若找到一个节点
            return left;
        }else { // 若找到两个节点
            return root;
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值