代码随想录-Day20-LetCode|530. 二叉搜索树的最小绝对差|617. 合并二叉树|700. 二叉搜索树中的搜索|98. 验证二叉搜索树

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

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。

差值是一个正数,其数值等于两值之差的绝对值。

思路  :使用双指针中序遍历的方式遍历。

        1,没有返回值,传入根节点,中序遍历二叉树

        2,从底层开始遍历,设置一个pre指针初始化为空,cur为当前节点。当pre不为空是说明cur已经指向pre的上一个节点,这时候我们返回两个节点直接的插值跟result比较的最小值。

之后将pre执行cur,双指针移动

        3,遍历右子树。


class Solution {
    //使用双指针递归遍历二叉树
    TreeNode pre=null;
    int result=Integer.MAX_VALUE;
    public int getMinimumDifference(TreeNode root) {
        travel(root);
        return result;
    }
    public void travel(TreeNode cur){
        if(cur==null) return;
        //单层递归逻辑
        //使用中续遍历
        travel(cur.left);
        if(pre!=null){
            result=Math.min(cur.val-pre.val,result);
        }
        pre=cur;
        travel(cur.right);
    }
}

501. 二叉搜索树中的众数

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

  • 结点左子树中所含节点的值 小于等于 当前节点的值
  • 结点右子树中所含节点的值 大于等于 当前节点的值
  • 左子树和右子树都是二叉搜索树

思路:继续使用双指针

        使用pre指针初始化为空指向后一个节点,count初始化为0计算当前节点出现的个数,一个最大值初始化为0.负责记录众数出现次数的最大值。

        1,无返回值,结果存储在res集合之中,传入根节点。

        2,使用中序遍历的方式首先遍历左子树,之后判断如果pre指针不为空,说明cur已经指向前一个结点,如果此时,pre为空。则count=1,这时候就只有一个数,如果pre和cur值相等,将counet数量加一,相当于众数多了一位,否则,count数重新置为一,判断结束之后,如果当前count等于maxvalue将结果加入结果集之中,后续如果出现更大的maxvalue清空结果集重新加入,

移动指针,遍历右子树。


class Solution {
    List<Integer> res=new ArrayList<>();
    TreeNode pre=null;
    int count=0;
    int maxvalue=0;   
    public int[] findMode(TreeNode root) {
        travel(root);
        int[] arr=new int[res.size()];
        for(int i=0;i<res.size();i++){
            arr[i]=res.get(i);
        }
        return arr;
    }
    private void travel(TreeNode cur){
        //使用双指针的思路采用中续的顺序遍历二叉树
        //递归结束条件
        if(cur==null) return;
        
        //  左
        travel(cur.left);
        //中
        //pre节点为空说已经遍历到了最左的节点,当前众树数量加一
        if(pre==null) count++;
        else if(pre.val==cur.val) count++;
        else count=1;
        //如果当前众数数量等于maxvalue我们直接将其加入结果集
        if(count==maxvalue) res.add(cur.val);
        //如果当前众树数量大于maxvalue我们将结果集清空,重新加入
        //新的结果集,更新最大值。
        if(count>maxvalue){
            res.clear();
            res.add(cur.val);
            maxvalue=count;
        }
        //移动指针,指向上一个节点
        pre=cur;
        //右
        travel(cur.right);
    }
}

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

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”


class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        return back(root,p,q);
    }
    TreeNode back(TreeNode root,TreeNode p,TreeNode q){
        if(root==null) return root;
        //如果遇到p或者q直接讲pq结果返回给上一层节点
        if(root==p || root==q) return root;
        
        //进行后续遍历
        TreeNode left=back(root.left,p,q);
        TreeNode right=back(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;
    }
}

                                                                                                                BY 三条直线围墙

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值