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

title: 二叉树和二叉搜索树的最近公共祖先

📃 题目一描述

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

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

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

🔔 解题思路

  1. 思考两个节点散布在二叉树上,应该是回溯 自底向上 遍历,才会得到结果;
  2. 要明白有一种情况是:必有也仅存在这样一个节点,左子树中含有一个要查询的节点,右子树中含有另一个要查询的节点;其他节点都是要么不包含,要么只在一个子树中包含;
  3. 另一种情况是: p或者q本身就是最近公共祖先;即答案是p或者q; 所以我们采用遇到p或q节点就返回,无需继续遍历;(我们可以假设答案就是第二种情况,那么遇到p或者q就返回,但是如果继续向上遍历过程中,遇到第2点的情况,那么这个就是答案;)
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (root == p || root == q || !root) return root; // 两种情况都考虑了
        // 后序遍历
        TreeNode* left = lowestCommonAncestor(root->left, p, q);
        TreeNode* right = lowestCommonAncestor(root->right, p, q);

        if (left && right) return root; // 是公共祖先
        else if (!left && right) return right; // 子树中存有一个子节点
        else if (!right && left) return left; // 子树中存有一个子节点
        else return nullptr;
    }
};

💥 复杂度分析

  • 时间复杂度:O(n);
  • 空间复杂度:O(n);

📃 题目二描述

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

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

🔔 解题思路

这道题也可以用上面的解法处理;

但是明显我们还可以用到BST树的性质;思路:

BST树中左子树都小于root->val,右子树都大于root->val,所以可以采用这种特效,看看能否减少一条边的查询!

  • 如果能,即答案在root节点的某一个子树上;
  • 而如果不能,证明左子树含有一个节点,右子树含有一个节点,那么该节点就是答案;
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if (root == p || root == q || root == nullptr) return root; // 可以省略,因为最后必有答案;

        if (root->val > p->val && root->val > q->val) {
            return lowestCommonAncestor(root->left, p, q);
        }
        else if (root->val < p->val && root->val < q->val) {
            return lowestCommonAncestor(root->right, p, q);
        }
        else return root; // p、q节点在该节点左右两边,这个节点必是公共祖先
    }
};

遍历法:

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        while (root) {
            if (root->val > p->val && root->val > q->val) { // 所找节点在左子树
                root = root->left;
            }
            else if (root->val < p->val && root->val < q->val) { // 所找节点在右子树
                root = root->right;
            }
            else break; // 左右子树都存在所找的节点;
        }
        return root;
    }
};

💥 复杂度分析

  • 时间复杂度:O(n);
  • 空间复杂度:O(1);

Original: https://www.cnblogs.com/D-booker/p/16362539.html
Author: D-booker
Title: 18. 二叉树和二叉搜索树的最近公共祖先

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/713325/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 012 Linux 搞懂用户权限升级(sudo 和 su),包学会😁

    Linux 系统中 root 账号通常用于系统的管理和维护,对操作系统的所有资源具有访问控制权限,当一个普通用户希望执行一些系统维护相关的操作的时候,就需要使用 sudo 命令,临…

    技术杂谈 2023年7月10日
    069
  • AppScan下载、安装、使用教程

    AppScan9.0.3.6破解版教程与免费下载 AppScan是一个Web漏洞扫描程序,主要适用于Windows系统。 百度网盘链接:https://pan.baidu.com/…

    技术杂谈 2023年5月31日
    0128
  • UI 参考

    posted @2021-10-07 09:16 DarJeely 阅读(27 ) 评论() 编辑 Original: https://www.cnblogs.com/Jeely/…

    技术杂谈 2023年5月31日
    0104
  • Mstar 平台(648)唤醒之串口唤醒

    串口唤醒功能主要是从supernova 待机进入PM后,串口接收PC端口发送过来的特定字串,然后将主板唤醒的功能。与IR,KEYPAD,WOL,CEC,MHL 等等基本流程一致,触…

    技术杂谈 2023年5月31日
    0125
  • MySQL的主从复制和分库分表初探

    主从复制 + 分库分表 要讲主从复制,首先来看看MySQL自带的日志文件。 日志 错误日志 错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及…

    技术杂谈 2023年6月21日
    0126
  • 重新学习数据库(1)

    单元概述 通过本章的学习能够了解MySQL结构查询语言的概念,掌握SELECT查询语句的基本语法,掌握SELECT查询语句中过滤条件的使用,掌握过滤条件中比较运算符和逻辑运算符的使…

    技术杂谈 2023年6月22日
    0103
  • 【Kubernetes系列】Container(容器)

    每个运行的容器都是可重复的; 包含依赖环境在内的标准,意味着无论你在哪里运行它都会得到相同的行为。 容器将应用程序从底层的主机设施中解耦。 这使得在不同的云或 OS 环境中部署更加…

    技术杂谈 2023年7月24日
    082
  • 关于提问

    A 和 B 对话如下: A: xx 产品,一个月一个版本,只包含一个小功能,培训销售的工作跟不上怎么办?培训工作跟不上,研发做的功能前端都不知道,那做了有什么用?为什么不规划成大版…

    技术杂谈 2023年7月11日
    087
  • Weblogic页面应用查询oracle数据库后台报错或页面日期格式显示错误

    问题:在生产环境中有两台WEB服务器,分别为227和228,部署的应用代码都是每日同步的,两边完全一致,但是某些页面查询数据时,227无结果,并且后台报java数组越界的错误,而2…

    技术杂谈 2023年7月11日
    076
  • Linux 配置Java环境变量

    前言:请各大网友尊重本人原创知识分享,谨记本人博客: 南国以南i 注:目前在官网下载的时候需要登陆,这边分享一个账号,方便下载 账号:2696671285@qq.com密码:Ora…

    技术杂谈 2023年7月11日
    079
  • react 代码优化

    1.减少setstate:setstate会增加render的次数,从而影响性能。如果涉及到与视图层无关的属性,直接当做class实例的属性,而不是state的状态。这样改变这个属…

    技术杂谈 2023年6月1日
    092
  • Prometheus 监控进程

    Process-exporter process-exporter可以用来检测所选进程的存活状态 下载process-exporter 下载地址:https://github.co…

    技术杂谈 2023年6月1日
    075
  • centOS7 开放/移除指定IP访问指定端口

    新增允许指定IP访问指定端口 firewall-cmd –permanent –add-rich=”rule family=’ipv…

    技术杂谈 2023年5月31日
    0108
  • Mysql重复数据查询置为空

    前两天产品有个需求,相同的商品因为价格不同而分开展示,但是明细还是算一条明细,具体区分展示出商品的价格和数量信息,其他重复的商品信息要置空。 需求并不难,用程序代码循环处理就可以了…

    技术杂谈 2023年7月11日
    093
  • Transformer模块初探

    Transformer笔记 前言背景 Transformer &#x4F9D;&#x8D56;&#x4E8E; Self Attention &#x…

    技术杂谈 2023年6月21日
    073
  • Centos6.x完全禁用IPv6的方法

    一、centos6.x完全禁用IPv6的方法 2.修改/etc/hosts,把ipv6的那句本地主机名解析的也注释掉: ::1 localhost localhost6 local…

    技术杂谈 2023年5月31日
    0110
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球