重生之我在代码随想录刷算法第十六天 | 530.二叉搜索树的最小绝对差、 501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

参考文献链接:代码随想录

本人代码是Java版本的,如有别的版本需要请上代码随想录网站查看。

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

力扣题目链接

解题思路

这道题跟昨天做的验证二叉搜索树一样,只需要中序遍历的情况下,每次记录上一次的val,用这次的val减去上一次的。

因为要求的是最小绝对差,二叉搜索树中序遍历刚好又是递增的。

代码示例
class Solution {
    	//记录最小值和前一节点值
        int result = Integer.MAX_VALUE;
        int pre = -1;
    public int getMinimumDifference(TreeNode root) {
        if(root == null){
            return result;
        }
        //前
        getMinimumDifference(root.left);
        //中
        if(pre != -1 && root.val - pre < result){
            result = root.val - pre;
        }
        pre = root.val;
        //后
        getMinimumDifference(root.right);    
        return result;    
    }
}

501.二叉搜索树中的众数

[力扣题目链接]

解题思路

这道题和上面那道思路一样,但是要记录出现的次数,从而记录下出现最多的数。详情看代码和注释。

代码示例
class Solution {
    TreeNode pre = null;
   	//记录出现的最大次数
    int maxCount = Integer.MIN_VALUE;
    int count = 1;
    ArrayList<Integer> resList = new ArrayList<>();
    public int[] findMode(TreeNode root) {
        if(root==null){
            return null;
        }
        findMode(root.left);
        int rootValue = root.val;
        // 计数
        //相等count就++
        if (pre == null || rootValue != pre.val) {
            count = 1;
        } else {
            count++;
        }
        //如果出现大于max的,就清空list并且添加
        if (count > maxCount) {
            resList.clear();
            resList.add(rootValue);
            maxCount = count;
        } else if (count == maxCount) {
            //如果相同,就添加进去
            resList.add(rootValue);
        }
        pre = root;
        findMode(root.right);
        int[] res = new int[resList.size()];
        for (int i = 0; i < resList.size(); i++) {
            res[i] = resList.get(i);
        }
        return res;
    }
}

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

力扣题目链接

解题思路

首先这道题目我们要想到要求祖先,我们要从底向下遍历,这样才能知道某两个节点是否有公共祖先,所以我们要后序遍历。

明确了这一点后,我们要明确递归的终止条件,也是解题关键,如果遇到了想找到两个节点之一怎么处理?

其实我们只需要向上return即可,这样就说明我们在下面遇到过了这个节点,如果在某个节点的left和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;
        }
        if(left!=null&&right==null){
            return left;
        }else if(left==null&&right!=null){
            return right;
        }else{
            return null;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值