博客
关于我
leetcode题解236-二叉树的最近公共祖先
阅读量:801 次
发布时间:2023-01-31

本文共 1694 字,大约阅读时间需要 5 分钟。

二叉树最近公共祖先的问题

在本文中,我们将探讨如何有效地找到二叉树中两个指定节点的最近公共祖先(LCA)。最近公共祖先的定义是两个指定节点的共同祖先,并且是可能的最深节点,这可能包括其中一个节点本身。

问题分析

给定一个二叉树,其中包含节点p和q,我们需要找到它们的最近公共祖先。根据题意,最近公共祖先可以是p或q本身,也可以是它们共享的最高祖先节点。

解题思路

我们采用递归法来解决这个问题。这种方法适用于层次遍历结构,能够有效地探索节点的路径。以下是详细的步骤:

  • 终止条件

    • 如果当前节点为空,返回null。
    • 如果当前节点是p或q,直接返回该节点。
  • 递归左、右子树

    • 递归左子树,获取左子树的LCA。
    • 递归右子树,获取右子树的LCA。
  • 处理返回值

    • 如果左子树返回null,说明p或q不在左子树中,直接返回右子树的结果。
    • 如果右子树返回null,同理,直接返回左子树的结果。
    • 如果两者都返回非null,则说明p和q分别位于根节点的左右子树中,根节点即为最近公共祖先。
  • 代码实现

    class Solution {   public TreeNode searchAncester(TreeNode root, TreeNode p, TreeNode q) {       if (root == null) {           return null;       }       if (root == p || root == q) {           return root;       } else {           TreeNode left = searchAncester(root.left, p, q);           TreeNode right = searchAncester(root.right, p, q);                      if (left == null) {               return right;           } else if (right == null) {               return left;           } else {               return root;           }       }   }      public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {       if (root == null) {           return null;       }       return searchAncester(root, p, q);   }}

    功能解释

    • searchAncester方法:这是递归函数,用于在树中搜索节点p和q,找到它们在根节点下的最近公共祖先。

      • 终止条件:检查当前节点是否为空或是否是目标节点p或q。
      • 递归左、右子树:分别递归左子树和右子树,获取各自的LCA。
      • 处理结果:根据左、右子树的LCA结果,确定整个树的LCA。
    • lowestCommonAncestor方法:这是入口函数,负责初始化树的根节点,并调用searchAncester方法进行搜索,返回树中节点p和q的最近公共祖先。

    示例验证

  • 示例1

    • 树:root = [3,5,1,6,2,0,8,null,null,7,4]
    • p = 5, q = 1
    • 输出:3(根节点3是5和1的最近公共祖先)
  • 示例2

    • 树:同样为root = [3,5,1,6,2,0,8,null,null,7,4]
    • p = 5, q = 4
    • 输出:5(5是两个节点的LCA)
  • 示例3

    • 树:root = [1,2]
    • p = 1, q = 2
    • 输出:1(1是两个节点的LCA)
  • 通过这些示例,可以验证我们的代码能够正确地找到较低层次或较高层次的最近公共祖先。代码逻辑严谨,RecursiveDepth较小,适用于较小规模的树,性能优越。

    转载地址:http://wegyk.baihongyu.com/

    你可能感兴趣的文章
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
    查看>>
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>
    nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
    查看>>
    NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
    查看>>
    NIFI分页获取Postgresql数据到Hbase中_实际操作---大数据之Nifi工作笔记0049
    查看>>
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_处理器介绍_处理过程说明---大数据之Nifi工作笔记0019
    查看>>
    NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
    查看>>
    NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
    查看>>
    NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控功能实际操作_Summary查看系统和处理器运行情况_viewDataProvenance查看_---大数据之Nifi工作笔记0026
    查看>>
    NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
    查看>>
    NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
    查看>>
    NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
    查看>>