数据结构刷题(十七):530二叉搜索树最小绝对差、501二叉搜索树中的众数、236二叉树的最近公共祖先、235二叉搜索树的最近公共祖先

news2025/1/17 0:03:25

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

题目链接

思路: 中序遍历保留为list + for循环找最小绝对差

二叉搜索树中序遍历后是有序的数组!!

注意:i = 1开始遍历

解法:

public int getMinimumDifference(TreeNode root) {
    List<Integer> res = new ArrayList<>();
    inorder(root, res);
    int num = Integer.MAX_VALUE;
    for (int i = 1; i < res.size(); i++) {
        if (num > res.get(i) - res.get(i - 1))
            num = res.get(i) - res.get(i - 1);
    }
    return num;
}

private void inorder(TreeNode root, List<Integer> res) {
    if (root == null)
        return;
    inorder(root.left, res);
    res.add(root.val);
    inorder(root.right, res);
}

二、二叉搜索树中的众数

题目链接

思路:中序遍历的迭代法(stack);

注意:

  • pre是cur的前驱结点,便于比较

  • 更新count时要注意count=maxcount的情况;

  • 当出现count>maxcount时需要清空原先列表中保存的元素

解法:

public int[] findMode(TreeNode root) {

    TreeNode pre = null;
    Stack<TreeNode> stack = new Stack<>();
    // 结果列表
    List<Integer> res = new ArrayList<>();
    TreeNode cur = root;
    int count = 0;
    int maxcount = 0;

    while (cur != null || !stack.isEmpty()){
        if (cur != null){
            stack.push(cur);
            cur = cur.left;
        }else{
            cur = stack.pop();
            // 判断当前节点是否出现过 或者  当前节点值与上一个节点值是否相等
            if (pre == null || cur.val != pre.val)
                count = 1;
            else
                count++;
            // 更新count
            if (count > maxcount){
                maxcount = count;
                res.clear();
                res.add(cur.val);
            }else if (count == maxcount){
                res.add(cur.val);
            }
            // 及时更新
            pre = cur;
            cur = cur.right;
        }
    }
    // 使用stream()做数据映射
    // mapToInt:一个流中的元素转换为 int 类型
    // 双冒号就是把方法当做参数传到stream内部,使stream的每个元素都传入到该方法里面执行一下
    // 最后转换为array类型
    return res.stream().mapToInt(Integer::intValue).toArray();
}

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

题目链接

思路:使用后序遍历(即回溯),

注意:

  • 还有一个情况,就是节点本身p,它拥有一个子孙节点q。

  • 在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。

  • 理解如果返回值left为空,right不为空为什么要返回right,为什么可以用返回right传给上一层结果。

过程图:(见代码随想录https://programmercarl.com/0236.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B1%E7%A5%96%E5%85%88.html#java)

解法:

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {

    if (root == null || root == p || root == q)
        return root;
    TreeNode left = lowestCommonAncestor(root.left, p, q);
    TreeNode right = lowestCommonAncestor(root.right, p, q);
    // 若未找到节点 p 或 q
    if (left == null && right == null){
        return null;
    }else if (left == null && right != null){
        return right;
    }else if (left != null && right == null){
        return left;
    }else        // 返回的节点都不为空,说明这两个节点就是p和q;
        return root;
}

四、二叉搜索树的最近公共祖先

题目链接

思路:还是后序遍历 ;或者同上题,直接可以用上次代码

注意:只要当cur节点在区间(p->val <= cur->val && cur->val <= q->val)

或者 (q->val <= cur->val && cur->val <= p->val)中,那么cur就是最近公共祖先了,直接返回。

解法:

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    if (root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left, p, q);
    if (root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right, p, q);
    return root;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/387361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++升级之路】第八篇:string类

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【C学习与应用】 ✒️✒️本篇内容&#xff1a;简单介绍string类的概念、string类的常用接口、string类的模拟实现&#xff08;各个常见接口的实现代码&…

初识数据结构——“数据结构与算法”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰进入一个全新的内容的学习&#xff0c;就是算法和数据结构啦&#xff0c;话不多说&#xff0c;让我们进入数据结构的世界吧 什么是数据结构&#xff1f; 什么是算法&#xff1f; 数据结构和算法的重要性 如何学好数据结构和算…

【开发者思维】优秀开发者应该具备的25个思维习惯

目录 1. 认真思考开发软件的目的 2. 明确软件设计的目标 3. 正确理解工作 4. 保持简洁 5. 控制复杂度 6. 软件维护 7. 保持一致 8. 优先级评测 9. 解决问题 10. 追求优秀即可 11. 预测

【MySQL中有哪些存储引擎?请你说说MySQL中innodb和myisam的区别?InnoDB引擎的三大特性?】

一.MySQL中有哪些存储引擎&#xff1f; InnoDB存储引擎 InnoDB是MySQL的默认事务型引擎&#xff0c;也是最重要、使用最广泛的存储引擎。它被设计用来处理大量的短期(short-lived)事务&#xff0c;应该优先考虑InnoDB引擎。MylSAM存储引擎 在MySQL 5.1及之前的版本&#xff0c…

PingCode 第三届开发者大会成功举办

PingCode 开发者大会或许会迟到&#xff0c;但永远不会缺席。原定于2022年10月24日举办的 “PingCode 开发者大会” 因疫情原因推迟&#xff0c;属于2022年 PingCode 开发者们的新知创想&#xff0c;不得不藏器待时。2023新春伊始&#xff0c;万象更新&#xff0c;伴随着万物逐…

不写代码、年薪百万,带你玩赚ChatGPT提示工程-高级提示

文章目录前言一、Zero-Shot提示二、Few-Shot 提示Few-shot Prompting 的局限性三、Chain-of-Thought Prompting四、Zero-Shot CoT五、Self-Consistency六、Generated Knowledge 提示七、Automatic Prompt Engineer (APE)总结前言 随着ChatGPT的大火&#xff0c;提示工程在大模…

按键修改阈值功能、报警功能、空气质量功能实现

按键修改阈值功能 要使用按键&#xff0c;首先要定义按键。通过查阅资料&#xff0c;可知按键的引脚如图所示&#xff1a;按键1&#xff08;S1&#xff09;通过KEY0与PA0连接&#xff0c;按键2&#xff08;S2&#xff09;通过KEY1与PE2连接&#xff0c;按键3&#xff08;S3&…

成本降低90%,OpenAI正式开放ChαtGΡΤ

今天凌晨&#xff0c;OpenAI官方发布ChαtGΡΤ和Whisper的接囗&#xff0c;开发人员现在可以通过API使用最新的文本生成和语音转文本功能。OpenAI称&#xff1a;通过一系列系统级优化&#xff0c;自去年12月以来&#xff0c;ChαtGΡΤ的成本降低了90%&#xff1b;现在OpenAI用…

供应链依赖:您的GitHub连接可能会触发什么?

不祥之兆&#xff0c;在针对 GitHub 存储库的攻击激增之后&#xff0c;很难避免。 最近的CircleCI漏洞&#xff08;客户的机密和加密密钥被盗&#xff09;清楚地表明&#xff0c;攻击者已经了解并利用了这个向量。 现在比以往任何时候都更需要公司保护这些非人类连接&#xf…

记录2023.3.3下午的校招

文章目录一、校招的总览意义&#x1f60e;二、校招时&#xff0c;公司是怎么做的&#xff1f;如何提问的&#xff1f;我又是怎么回答的&#x1f914;2.1 公司最喜欢提问你的问题&#x1f64c;三、校招期间&#xff0c;我应该如何去了解一家企业&#xff1f;&#x1f600;三、建…

LeetCode 982. 按位与为零的三元组 -- 哈希统计

按位与为零的三元组 困难 101 相关企业 给你一个整数数组 nums &#xff0c;返回其中 按位与三元组 的数目。 按位与三元组 是由下标 (i, j, k) 组成的三元组&#xff0c;并满足下述全部条件&#xff1a; 0 < i < nums.length 0 < j < nums.length 0 < k <…

【C++笔记】异常处理

C语言处理错误的方式 传统的错误处理机制&#xff1a; 1.终止程序缺陷&#xff1a;用户难以接受。 2.返回错误码&#xff1a;缺陷&#xff1a;需要自己去查错误码对应的解释。 C语言一般使用错误码来处理错误&#xff0c;部分情况下才会用终止情况处理处理严重的错误。 C异常…

初识Liunx下的进程状态和环境变量以及进程优先级

文章目录前言1.进程状态1.阻塞与挂起2.Linux下的进程状态1.概念知识2.R状态2.休眠状态(S/D&#xff09;3.T状态4.Z状态(僵尸进程)和X状态5.孤儿进程3.环境变量1.概念2.获取环境变量1.环境变量表2.函数获取环境变量3.关于环境变量的理解和main函数中的两个参数1.环境变量的理解2…

学习笔记--目标检测基础知识大全

来源&#xff1a;投稿 作者&#xff1a;LSC 编辑&#xff1a;学姐 目录 1.特点 2.数据集 2.1 VOCS数据集 2.2 COCO数据集 3.评价指标 3.1 GroundTruth 3.2 IOU(交并比&#xff0c;Intersection over Union) 3.3 基本指标 3.4 AP与mAp 3.5 案例演示 4. 脑图&#xff…

代码规范----编程规约(下)

目录 四、OOP规约 五、日期时间 六、集合处理 四、OOP规约 &#xff08;1&#xff09;、避免通过一个类的对象引用访问此类的静态变量或静态方法&#xff0c;无谓增加编译器解析成本&#xff0c;直接用类名来访问即可 &#xff08;2&#xff09;、所有的覆写方法&#xff0…

【C语言学习笔记】:二级指针

指针可以指向一个普通类型的数据&#xff0c;例如 int、double、char 等&#xff0c;也可以指向一个指针类型的数据&#xff0c;例如 int *、double *、char * 等。 如果一个指针指向的是另外一个指针&#xff0c;我们就称它为二级指针&#xff0c;或者指向指针的指针。 假设…

Leetcode.2017 网格游戏

题目链接 Leetcode.2017 网格游戏 Rating &#xff1a; 1719 题目描述 给你一个下标从 0 开始的二维数组 grid&#xff0c;数组大小为 2 x n&#xff0c;其中 grid[r][c]表示矩阵中 (r, c)位置上的点数。现在有两个机器人正在矩阵上参与一场游戏。 两个机器人初始位置都是 (0…

带你看懂RuoYi动态数据源切换

文章目录数据源是什么一、spring中是如何处理各种数据源的&#xff1f;1.开搞springboot2.创建一个测试类二、有了如上的理论,那么想想动态切换数据源吧参考若依的动态数据源配置总结数据源是什么 数据源,对于java来说,就是可用的数据库,那么我平时开发的springboot springclo…

算机网络安全基础知识5:sql注入漏洞攻击,DVWA演示sql注入漏洞,如何利用sql注入查看数据库信息,sqlmap,sql注入漏洞的防御

算机网络安全基础知识5:sql注入漏洞攻击&#xff0c;DVWA演示sql注入漏洞&#xff0c;如何利用sql注入查看数据库信息&#xff0c;sqlmap&#xff0c;sql注入漏洞的防御 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能…

Unity/C#------委托与事件(一篇文章彻底搞懂...)

一&#xff1a;委托 所有的代码语言创造者母语都是英语&#xff0c;我们从英语翻译到中文的过程中难免会存在一些不太能还原本意的词&#xff0c;比如我之前一直不理解构造函数和析构函数&#xff0c;只知道这俩货作用相反&#xff0c;直到我看到了它的英文意思&#xff0c;Con…