java算法第21天 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236. 二叉树的最近公共祖先

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

在这里插入图片描述

这道题的二叉树是二叉搜索树,因此最小绝对差一定在中序遍历的相邻节点之间产生。
**思路:**用pre节点记录当前节点cur的前一个结点,cur.val-pre.val就是差值。不断更新差值找到最小的差值。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    private int minValue=Integer.MAX_VALUE;
    TreeNode pre;
    public int getMinimumDifference(TreeNode root) {
        getMin(root);
        return minValue;
    }

    public void getMin(TreeNode node){
        if(node==null) return;
        getMin(node.left);
        if(pre!=null){
            int temp=node.val-pre.val;
            if(temp<minValue) minValue=temp;
        }
        pre=node;
        getMin(node.right);
        return;
    }
}

501.二叉搜索树中的众数

在这里插入图片描述

思路: 使用一个全局的动态数组result来存储当前出现次数最多的数(注意,可能后面还有出现次数更多的数),当遇到出现次数更多的数时,更新result中的数。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    List<Integer> res=new ArrayList<>();
    int maxCount=0;//记录最大出现次数
    int count=0;//记录当前节点的值出现的次数
    TreeNode pre;//保存前一个节点
    public int[] findMode(TreeNode root) {
        getMode(root);
        int[] result=new int[res.size()];
        int index=0;
        for(int i:res){
            result[index++]=i;
        }
        return result;
    }
    public void getMode(TreeNode node){
        if(node==null) return;
        getMode(node.left);
        if(pre==null) count=1;
        else{
            if(node.val==pre.val){
                count++;
            }else{
                count=1;
            }
        }
        if(count==maxCount) res.add(node.val);
        else if(count>maxCount){
            res.clear();
            res.add(node.val);
            maxCount=count;
        }
        pre=node;
        getMode(node.right);
        return;
    }
}

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

在这里插入图片描述

思路:
情况一:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。
在这里插入图片描述

情况二:节点本身p(q),它拥有一个子孙节点q§
在这里插入图片描述
其实情况一 和 情况二 代码实现过程都是一样的,也可以说,实现情况一的逻辑,顺便包含了情况二。

因为遇到 q 或者 p 就返回,这样也包含了 q 或者 p 本身就是 公共祖先的情况。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        return getLowestCommonAncestor(root,p,q);
    }

    public TreeNode getLowestCommonAncestor(TreeNode node, TreeNode p, TreeNode q){
        if(node==null) return null;
        if(node==p || node==q) return node;
        TreeNode left=getLowestCommonAncestor(node.left,p,q);
        TreeNode right=getLowestCommonAncestor(node.right,p,q);
        if(left!=null && right!=null) return node;
        else if(left!=null && right==null) return left;
        else if(left==null && right!=null) return right;
        else return null;
    }
}
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值