代码随想录day21

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

● 力扣题目链接
● 给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。

思路

● 中序遍历可以得到数组,比较这个数组相邻元素绝对差,找最小值即可

代码

class Solution {
    int res = Integer.MAX_VALUE;
    TreeNode pre;
    public int getMinimumDifference(TreeNode root) {
        if (root == null) return res;
        getMinimumDifference(root.left);
        if (pre != null) {
            res = Math.min(res, root.val - pre.val);
        }
        pre = root;
        getMinimumDifference(root.right);
        return res;
    }
}

class Solution {
    public int getMinimumDifference(TreeNode root) {
        TreeNode pre = null;
        int res = Integer.MAX_VALUE;
        Deque<TreeNode> stack = new ArrayDeque();
        while (root != null || !stack.isEmpty()) {
            while (root != null) {
                stack.addFirst(root);
                root = root.left;
            }
            root = stack.removeFirst();
            if (pre != null) {
                res = Math.min(res, root.val - pre.val);
            }
            pre = root;
            root = root.right;
        }
        return res;
    }
}

501.二叉搜索树中的众数

● 力扣题目链接
● 给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。

思路

● 不利用二叉搜索树特性,先遍历树,得到一个map,key是值,value是出现次数,然后对这个map按value排序,得到list,这个list第一个entry的key一定是我们要的,然后再遍历一遍list,看有没有和第一个元素相等的key即可
● 利用二叉搜索树特性,只遍历一遍树就可以解决,中序遍历可以得到一个有序的数组。如果这个元素和前一个值相等,count++,不等或前一个是null,count就为1,然后都要看一下count和maxCount(count置1也要看,比如只有一个根结点的树),如果等于,就在list中加入这个元素,众数的一个;如果大于,那新的更大的数出现了,把list清空,再加入

代码

class Solution {
    Map<Integer, Integer> map;
    public int[] findMode(TreeNode root) {
        map = new HashMap();
        List<Integer> list = new ArrayList<>();
        tr(root);
        List<Map.Entry<Integer, Integer>> mapList = map.entrySet().stream()
				.sorted((c1, c2) -> c2.getValue().compareTo(c1.getValue()))
				.collect(Collectors.toList());
		list.add(mapList.get(0).getKey());
		for (int i = 1; i < mapList.size(); i++) {
			if (mapList.get(i).getValue() == mapList.get(i - 1).getValue()) {
				list.add(mapList.get(i).getKey());
			} else {
				break;
			}
		}
		return list.stream().mapToInt(Integer::intValue).toArray();
    }
    private void tr(TreeNode root) {
        if (root == null) return;
        tr(root.left);
        map.put(root.val, map.getOrDefault(root.val, 0) + 1);
        tr(root.right);
    }
}

class Solution {
    List<Integer> resList;
    int count;
    int maxCount;
    TreeNode pre;
    public int[] findMode(TreeNode root) {
        resList = new ArrayList();
        count = 0;
        maxCount = 0;
        pre = null;
        find(root);
        return resList.stream().mapToInt(Integer::intValue).toArray();
    }
    private void find(TreeNode root) {
        if (root == null) return;
        find(root.left);
        if (pre == null || root.val != pre.val) {
            count = 1;
        } else {
            count++;
        }
        if (count > maxCount) {
            resList.clear();
            resList.add(root.val);
            maxCount = count;
        } else if (count == maxCount) {
            resList.add(root.val);
        }
        pre = root;
        find(root.right);
    }
}

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

● 力扣题目链接
● 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

思路

● 回溯,再想想逻辑
● 左右都不是,返回null;有一个是,返回这个;都是,返回root,就找到了

代码

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        // 遍历到叶子,返回null;遍历到p或者q,要想上返回
        if (root == null || root == p || root == q) return root;
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        // 如果左右返回的都是null,说明这里没有,向上返回null
        if (left == null && right == null) return null;
        // 左右有一个不是null,找到了一个,返回这个
        else if (left != null && right == null) return left;
        else if (left == null && right != null) return right;
        // 左右两个都不是null,因为是从底向上回溯,因此这个root就是最近的公共祖先
        else return root;
    }
}

你可能感兴趣的:(代码随想录,java,算法,数据结构)