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

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

题目链接:530.二叉搜索树的最小绝对差

思路:题目中要求返回BST中任意两个结点的最小绝对差值。由于BST的特性 中序遍历是有序的 所以如果是最小绝对差值那么这两个结点在中序遍历中一定是相邻的。如果采用双指针的策略。一个快指针,一个慢指针。那么最后的值肯定是快指针的值减去慢指针的值。事先定义一个变量res,res一开始存放一个很大的值 例如INT_MAX 然后开始用快慢指针中序遍历二叉树。用慢指针案来操作中的遍历逻辑。因为当慢指针为空才是代表遍历结束。当慢指针不为空的时候,用res接受res和快指针-慢指针的最小值。这样最后得出res就是最小绝对差

具体实现:

class Solution {
    TreeNode pre;
    int res=Integer.MAX_VALUE;;
    public int getMinimumDifference(TreeNode root) {
        traversal(root);
        return res;
    }

    public void traversal(TreeNode cur){
        if (cur==null){
            return;
        }
        traversal(cur.left);
        if (pre!=null){
            res = Math.min(res,Math.abs(cur.val-pre.val));
        }
        pre = cur;
        traversal(cur.right);
    }
}

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

题目链接:501.二叉搜索树中的众数

思路:返回出现次数最多的元素,相同出现次数一起返回形成一个数组。那么必然是要统计每个元素出现的次数。而且是BST 一眼中序遍历。同样是使用双指针。和530一样。当遍历第一个元素count值为1.然后当快指针与慢指针的值相同时,count++,如果不同count直接设为1代表该元素出现了一次。同时这里还要设置另外一个遍历maxCount,maxCount初值可以为0.因为count是不断变化的,肯定要一个遍历不断存放最大的count。如果count>maxCount,就将count赋值给maxCount。同时我们的结果数组要清零。并将此时count对应的快慢指针指向的元素放入结果数组。每当count==maxCount时候就代表此时对应的快慢指针的值就是要找的值就应该放入结果数组中

具体实现:

class Solution {
    TreeNode pre;
    int count =0;
    int maxcount=0;
    List<Integer> list = new ArrayList<>();

    public int[] findMode(TreeNode root) {

        find(root);
        int[] res = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            res[i] = list.get(i);
        }
        return res;

    }

    public void find(TreeNode root){
        if (root==null){
            return;
        }
        find(root.left);
        if (pre==null){
            count=1;
        }else if (pre.val ==root.val){
            count++;
        }else {
            count=1;
        }

        if (count==maxcount){
            list.add(root.val);
        }
        if (count>maxcount){
            maxcount=count;
            list.clear();
            list.add(root.val);
        }

        pre = root;

        find(root.right);

    }
}

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

题目链接:236. 二叉树的最近公共祖先

思路:本题要求返回任意两个结点的最近的公共祖先。其实是一个从下不断往上的过程。应当采取后序遍历。当遍历到给的两个结点时候,需要把当前的结点向上一层递归返回。

具体实现:

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root==null){
            return root;
        }
        //遇到p和q向上返回
        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;
        }
        //左边的返回值不为空 右边的返回值为空 则代表p和q不在右子树 需要返回左子树
        if (left!=null && right==null){
            return left;
        }
        //右边的返回值不为空 左边的返回值为空 则代表p和q不在左子树 需要返回右子树
        if (left==null && right!=null){
            return right;
        }
        return  null;

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值