热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LeetCode第236题二叉树的最近公共祖先

给定一个二叉树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个结点p、q,最近公共祖先表示为一个结点x,满足x是p、q的祖先且x的深度
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

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

例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]




示例 1:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。
示例 2:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出: 5
解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。







思路: LCA问题
与二叉搜索树的最近公共祖先不同,此题左右节点大小没有固定关系.


    

       eg :    LCA(3,1) = 3  //其中一个节点与3相等  }
          LCA(1,3) = 3  //其中一个节点与3相等  }
          LCA(5,8) = 3  //分部在3的左右子树中  } 我们可以发现,只要 (一个在3的左边,一个在3的右边)||(其中一个节点的值与root相等) ,LCA的值都为3
          LCA(6,8) = 3  //分布在3的左右子树   }  
LCA(8,7) = 3  //分布在3的左右子树中  }
          LCA(6,4) = 5   //分布在5的左右子树中 } 当root为5时,与上一情况相同(一个在左一个在右)||(其中一个节点的值与root相同)
          LCA(5,2) = 5  //其中一个节点与5相等 } 
       
          
          

对搜索规则进行介绍:

        目的:  以某个节点为根结点,如果两个问题节点分别在此根结点的左右两侧 或其中一个问题节点与这个节点相等,那么这个节点就是解.
                    如果两个问题节点都分布在根结点的一端,那么这个节点就不是解,但是这一端中包含着问题的解,而另一端则不含解

      1) 对于root节点: 如果root为空节点,返回null
     如果root与p或q相等,返回p或q.

      2) 如果没有在情况1返回,说明root不为空并且不与p,q相等
         那么,可能节点的分布存在以下情况:

         一:节点一个分布在root的左子树一个分布在root的右子树
         二:节点都分布在root的左子树
         三:节点都分布在root的右子树

         我们对左右节点分别进行递归.左右节点分别成为新root节点.(记为新root节点)
        
     3) 那么,左右两个搜索方法的返回值 searchLeft和searchRight 也根据搜索有了不同的情况
         一: searchLeft 和 searchRight 都不为空,对应着情况一
         二: searchLeft不为空,searchRight为空 , 对应着情况二
         三: searchRight不为空,searchLeft为空 , 对应着情况三

 1 class Solution236 {  2 
 3   public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {  4     if (root == null || root == p || root == q) {  5       return root;  6  }  7     TreeNode searchLeft = lowestCommonAncestor(root.left, p, q);  8     TreeNode searchRight = lowestCommonAncestor(root.right, p, q);  9 
10     if (searchLeft != null && searchRight != null) { //左右各有一个节点
11       return root; 12  } 13     if (searchLeft != null) { //节点都在左边
14       return searchLeft; 15  } 16     return searchRight; 17 
18  } 19 }

 

   




推荐阅读
  • 近期,谷歌公司的一名安全工程师Eduardo Vela在jQuery Mobile框架中发现了一项可能引发跨站脚本攻击(XSS)的安全漏洞。此漏洞使得使用jQuery Mobile的所有网站面临潜在的安全威胁。 ... [详细]
  • 本文概述了算法的基础概念,包括时间复杂度的计算规则,以及常见的递归算法的时间复杂度分析。同时,详细介绍了数组和链表的基本特性及其操作的时间复杂度,并提供了几个关于链表操作的具体示例。最后,探讨了栈和队列的概念及其应用,包括如何利用这些数据结构解决实际问题。 ... [详细]
  • 可能存在无限递归_递归算法看这一篇就够了|多图
    前言递归是一种非常重要的算法思想,无论你是前端开发,还是后端开发,都需要掌握它。在日常工作中,统计文件夹大小, ... [详细]
  • 自SQL Server 2005以来,微软的这款数据库产品逐渐崭露头角,成为企业级应用中的佼佼者。本文将探讨SQL Server 2008的革新之处及其对企业级数据库市场的影响。 ... [详细]
  • 地球坐标、火星坐标及百度坐标间的转换算法 C# 实现
    本文介绍了WGS84坐标系统及其精度改进历程,探讨了火星坐标系统的安全性和应用背景,并详细解析了火星坐标与百度坐标之间的转换算法,提供了C#语言的实现代码。 ... [详细]
  • 本文探讨了在JavaScript中执行字符串形式代码的多种方法,包括使用eval()函数以及跨页面调用的方法。同时,文章详细介绍了JavaScript中字符串的各种常用方法及其应用场景。 ... [详细]
  • 前文|功能型_品读鸿蒙HDF架构
    前文|功能型_品读鸿蒙HDF架构 ... [详细]
  • 深入理解KMP算法及其应用
    本文详细介绍了KMP算法的原理和实现方法,包括如何计算next数组以及如何利用next数组进行高效的字符串匹配。 ... [详细]
  • 本文探讨了亚马逊Go如何通过技术创新推动零售业的发展,以及面临的市场和隐私挑战。同时,介绍了亚马逊最新的‘刷手支付’技术及其潜在影响。 ... [详细]
  • 浪潮AI服务器NF5488A5在MLPerf基准测试中刷新多项纪录
    近日,国际权威AI基准测试平台MLPerf发布了最新的推理测试结果,浪潮AI服务器NF5488A5在此次测试中创造了18项性能纪录,显著提升了数据中心AI推理性能。 ... [详细]
  • 回顾与学习是进步的阶梯。再次审视卷积神经网络(CNNs),我对之前不甚明了的概念有了更深的理解。本文旨在分享这些新的见解,并探讨CNNs在图像识别和自然语言处理等领域中的实际应用。 ... [详细]
  • 本文详细介绍了如何通过微信H5网页授权机制获取用户的code,并进一步获取用户的基本信息,包括必要的配置步骤和前端代码实现。 ... [详细]
  • 本文介绍了如何在C++中使用new关键字动态创建一维和二维数组,并详细解释了常见的错误及其解决方案。 ... [详细]
  • 随着5G、云计算、人工智能、大数据等新技术的广泛应用,人们的生活生产方式发生了深刻变化。从人际互联到万物互联,数据存储与处理需求激增,推动了数据与算力设施的发展。 ... [详细]
  • 本文详细介绍了在Ubuntu 7.10操作系统上安装多种常用软件的方法,包括RAR压缩工具、即时通讯软件Pidgin、办公软件永中Office 2007试用版、多线程下载软件MultiGet及d4x、FTP客户端gFTP与FireFTP插件,以及P2P下载工具aMule。每部分都提供了具体的安装步骤和配置方法。 ... [详细]
author-avatar
周天芷65486
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有