二叉树7|530.二叉搜索树的最小绝对差|501.二叉搜索树中的众数| 236. 二叉树的最近公共祖先

二叉树7|530.二叉搜索树的最小绝对差|501.二叉搜索树中的众数| 236. 二叉树的最近公共祖先

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

题目连接:530. 二叉搜索树的最小绝对差 - 力扣(LeetCode)

  1. 思路:用双指针法,利用二叉树搜索树的性质,中序遍历是递增序列,最小绝对差肯定是相邻的两个节点之差。遍历二叉树,用 pre 记录前一个节点,用 minmum 记录最小差值。当root 与 pre 差值比minmum小时,更新minmum的值。
  2. 注意当二叉树为空的时候返回 0
class Solution {
    int minmum = Integer.MAX_VALUE;
    TreeNode pre = null;
    public int getMinimumDifference(TreeNode root) {
        if(root == null) return 0;
        getMin(root);
        return minmum;
    }

    public void getMin(TreeNode root){
        if(root == null) return;
        getMin(root.left);
        if(pre != null && root != null){
            int tmp = Math.abs(root.val - pre.val);
            if(tmp < minmum){
                minmum = tmp;
            }
        }
        pre = root;
        getMin(root.right);
    }
}

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

题目连接:501. 二叉搜索树中的众数 - 力扣(LeetCode)

  1. 思路:双指针法,二叉搜索树中序遍历是有序的,遍历有序的元素出现频率,从头遍历,那么一定是相邻两个元素作比较,然后就把出现频率最高的元素输出就可以。
  2. 注意如果不采用遍历两次的方法,可以用两个变量 count 和 maxCount 分别记录当前值出现的次数和当前最大频率。如果count = macCount 说明当前元素也是当前出现频率最高的元素,需要添加到list集合中;如果count > macCount 说明当前最大频率不是整个二叉树的最大频率,需要清空list里记录的元素。
class Solution {
    TreeNode pre = null;
    int count = 0;
    int macCount = 0;
    List<Integer> list = new ArrayList<Integer>();
    public int[] findMode(TreeNode root) {
        traversal(root);
        int[] res = new int[list.size()];
        for(int i = 0; i < list.size(); i++){
            res[i] = list.get(i);
        }
        return res;
    }

    public void traversal(TreeNode root){
        if(root == null) return;
        traversal(root.left);
        if(pre == null) count = 1;
        else if(pre.val == root.val) count++;
        else count = 1;
        pre = root;
        if(count == macCount) list.add(root.val);
        if(count > macCount){
            macCount = count;
            list.clear();
            list.add(root.val);
        }
        traversal(root.right);
    }
}

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

题目连接:236. 二叉树的最近公共祖先 - 力扣(LeetCode)

  1. 最小公共祖先,需要从底向上遍历 ,采用后序遍历。题目强调:二叉树节点数值是不重复的,而且一定存在 q 和 p
  2. 思路:如果左子树出现 p ,右子树出现 q ,则该节点为最近公共祖先。如果left 和 right都不为空,说明此时root就是最近公共节点;如果left为空,right不为空,就返回right,说明目标节点是通过right返回的,反之依然。
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null) return null;
        if(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 root;
        else if(left == null && right != null) return right;
        else if(left != null && right == null) return left;
        else return null;
    }
}

你可能感兴趣的:(Java刷题,leetcode,算法,数据结构,深度优先,java)