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

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

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

题目链接:https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/
思路:求任意两个节点之间的差值的绝对值的最小值,要求最小值可以利用二叉搜索树的特性,中序遍历后是单调递增序列,要求最小值必须得是紧挨着的两个数,故只需要中序遍历保留前一个节点即可。

class Solution {
    int temp = Integer.MAX_VALUE;
    TreeNode pre = null;
    public int getMinimumDifference(TreeNode root) {
        order(root);
        return temp;
    }

    void order(TreeNode root) {
        if (root == null)return;
        order(root.left);
        if (pre != null) {
            temp = Math.min(Math.abs(root.val - pre.val), temp);
        }
        pre = root;
        order(root.right);
    }
}

二、 501.二叉搜索树中的众数

题目链接:https://leetcode.cn/problems/find-mode-in-binary-search-tree/
思路:要注意这题重数的定义。

class Solution {
    List<Integer> result = new ArrayList<>();
    TreeNode pre = null;
    int count = 0, max = 0;
    public int[] findMode(TreeNode root) {
        order(root);
        int[] t = new int[result.size()];
        for (int i = 0; i < result.size(); i++) {
            t[i] = result.get(i);
        }
        return t;
    }

    void order(TreeNode root) {
        if (root == null) return;
        order(root.left);
        int t = root.val;
        if (pre == null || pre.val != t) {
            count = 1;
        }else {
            count++;
        }
        pre = root;
        if (count > max) {
            result.clear();
            result.add(t);
            max = count;
        }else if (count == max) {
            result.add(t);
        }
        order(root.right);
    }
}

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

题目链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/
思路:后序遍历。

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) {
            return null;
        }else if (left == null && right != null) {
            return right;
        }else if (left != null && right == null) {
            return left;
        }else {
            return root;
        }
    }
}

你可能感兴趣的:(力扣算法题,算法,数据结构)