码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 刷题笔记(十八)--二叉树:公共祖先问题


    目录

    • 系列文章目录
    • 前言
    • 题录
      • 236. 二叉树的最近公共祖先
        • 步骤一
        • 步骤二
        • 步骤三
      • 235. 二叉搜索树的最近公共祖先

    系列文章目录

    刷题笔记(一)–数组类型:二分法
    刷题笔记(二)–数组类型:双指针法
    刷题笔记(三)–数组类型:滑动窗口
    刷题笔记(四)–数组类型:模拟
    刷题笔记(五)–链表类型:基础题目以及操作
    刷题笔记(六)–哈希表:基础题目和思想
    刷题笔记(七)–字符串:经典题目
    刷题笔记(八)–双指针:两数之和以及延伸
    刷题笔记(九)–字符串:KMP算法
    刷题笔记(十)–栈和队列:基础题目
    刷题笔记(十一)–栈和队列:Top-K问题
    刷题笔记(十二)–复习:排序算法
    刷题笔记(十三)–二叉树:前中后序遍历(复习)
    刷题笔记(十四)–二叉树:层序遍历和DFS,BFS
    刷题笔记(十五)–二叉树:属性相关题目
    刷题笔记(十六)–二叉树:修改与构造
    刷题笔记(十七)–二叉搜索树:关于属性问题

    前言

    二叉树快完了,加油!!!

    题录

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

    题目链接如下:

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

    题目截图如下:

    在这里插入图片描述
    这道题怎么做呢?其实是要分步骤进行

    步骤一

    给出根节点,和目标节点,然后查看目标节点是否为根节点的子树。这个很简单不是?

    public boolean find(TreeNode root,TreeNode target){
            if(root == null) return false;
            if(root == target) return true;
            return find(root.left,target) || find(root.right,target);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    步骤二

    那接下来肯定就是要分情况讨论了

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
            //接下来就是进行判断
            if(root == null) return null;
            if(root == p || root == q) return root;//如果说p或者q任意一个为根节点,那祖先肯定是根节点
            //如果说p q节点都在左侧,那就去左子树找祖先
            if(find(root.left,p) && find(root.left,q)) return lowestCommonAncestor(root.left,p,q);
            //如果说p q节点都在右侧,那就去右子树找祖先
            if(find(root.right,p) && find(root.right,q)) return lowestCommonAncestor(root.right,p,q);
            //如果不同时在一侧,那当前节点肯定就是祖先
            return root;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    步骤三

    第三步是什么呢?肯定就是化简啦,上面那样写肯定是可以的,但是有点长。先上代码吧,然后再对代码讲解一下

    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);
            if(left == null && right == null) return null;
            if(left == null) return right;
            if(right == null) return left;
            return root;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这个代码就是把步骤一和步骤合并,但是这里吧…emmm,重点就是:后序遍历。和上面一样,分成两步来看

    步骤一:
    在这里插入图片描述
    这是第一步,就是一个不断递归的过程,然后去寻找p和q节点。

    在这里插入图片描述
    这是第二步,是对寻找的情况进行判断。

    这两步就是对每一层递归的分解,好像有点乱是不是??emmm,先停一下,后续如果我可以组织好自己的语言再继续。

    235. 二叉搜索树的最近公共祖先

    题目链接:

    235. 二叉搜索树的最近公共祖先

    题目截图:

    在这里插入图片描述

    其实是可以当做一个普通的树来进行处理的,但是这里既然提到了二叉搜索树,和上题一样,甚至代码都不用变动。
    在这里插入图片描述

    但是呢,这里既然提到了二叉搜索树,那么肯定是可以通过二叉搜索树的性质对当前时间复杂度进行优化。

    public class 二叉搜索树的公共祖先 {
        //二叉树的公共祖先是后序遍历了,那这里我还可以后续遍历嘛?我第一思路是前序遍历
        //前序遍历还是有点小问题,return root重复了
        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;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    水电站与数据可视化:洞察未来能源趋势的窗口
    建立复数类
    你的英语目前处在什么样的水平?
    前端性能优化之LightHouse
    SpringCloud 服务治理:Eureka、Consul、Nacos
    cubeIDE开发,结合汉字取模工具,在LCD输出各种字体
    【Kotlin】‘name‘ hides member of supertype ‘Enum‘ and needs ‘override‘ modifier
    代码随想录2.5——数组:904水果成篮、76最小覆盖子串
    OPPO realme 真我 一加 刷机工具下载 ColorOS Upgrade Tool
    微信安装包从0.5M暴涨到260M,为什么我们的程序越来越大?
  • 原文地址:https://blog.csdn.net/weixin_53860901/article/details/125433538
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号