代码随想录算法训练营第二十一天| 530.二叉搜索树的最小绝对差.501.二叉搜索树中的众数 236. 二叉树的最近公共祖先

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

public static int getMinimumDifference(TreeNode root) {
    List<Integer> list = new ArrayList<>();
    getValue(root, list);
    if (list.size() == 0) {
        return 0;
    }
    List<Integer> ans = new ArrayList<>();
    for (int i = 0; i < list.size() - 1; i++) {
        ans.add(Math.abs(list.get(i) - list.get(i + 1)));
    }
    ans.sort(null);
    return ans.get(0);

}

public static void getValue(TreeNode root, List<Integer> list) {
    if (root == null) {
        return;
    }
    getValue(root.left, list);
    list.add(root.val);
    getValue(root.right, list);


}

501.二叉搜索树中的众数

public int[] findMode(TreeNode root) {
    List<Integer> list = new ArrayList<>();
    getValue(root, list);
    if (list.size() == 0) {
        return null;
    }

    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < list.size(); i++) {
        if (!map.containsKey(list.get(i))) {
            map.put(list.get(i), 1);
        } else {
            Integer time = map.get(list.get(i));
            map.put(list.get(i), time + 1);
        }
    }
    List<Integer> ans = map.values().stream().collect(Collectors.toList());
    ans.sort(null);
    int time = 0;
    for (Integer an : ans) {
        if (an == ans.get(ans.size() - 1)) {
            time++;
        }
    }

    List<Integer> resList = new ArrayList<>();
    Set<Map.Entry<Integer, Integer>> entries = map.entrySet();
    for (Map.Entry<Integer, Integer> entry : entries) {
        if (entry.getValue() == ans.get(ans.size() - 1)) {
            resList.add(entry.getKey());
        }
    }
    int[] res = new int[time];
    for (int i = 0; i < resList.size(); i++) {
        res[i] = resList.get(i);
    }
    return res;
}
public  void getValue(TreeNode root, List<Integer> list) {
    if (root == null) {
        return;
    }
    getValue(root.left, list);
    list.add(root.val);
    getValue(root.right, list);

}

236. 二叉树的最近公共祖先 

TreeNode ans = null;

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    countNode(root, p, q);
    return ans;
}

public int countNode(TreeNode root, TreeNode p, TreeNode q) {
    if (root == null) {
        return 0;
    }

    int lcnt = countNode(root.left, p, q);
    int rcnt = countNode(root.right, p, q);

    if (lcnt == 1 && rcnt == 1) {
        ans = root;
    } else if (lcnt == 1 || rcnt == 1) {
        if (root == q || root == p) {
            ans = root;
        }
    }
    return lcnt + rcnt + ((root == q || root == p) ? 1 : 0);

}
  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值