力扣236. 二叉树的最近公共祖先(java DFS解法)

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

文章目录

  • 题目描述
  • 思路
  • 解题方法
  • 复杂度
  • Code

题目描述

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

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

在这里插入图片描述

思路

首先我们要注意到题目所给提示**二叉树的所有节点值均不相等!!!**在此基础上我们可以得到二叉树的最近公共祖先唯一存在如下两种情况:

1.若当前节点的左子树和右子树均存在给定节点的其一,则当前节点为最近公共祖先;
2.若当前节点等于所给节点的其中一个,同时当前节点的左子树或者右子树中存在所给节点的另一个节点,则当前节点为最近公共祖先

如下图示:
image.png
image.png

解题方法

1.定义一个TreeNode类型的指针命名为location用于记录并返回最后的最近公共祖先
2.递归后续遍历二叉树,记录当前节点(包括当前节点)的左子树或右子树节点等于给定节点的个数
3.判断当前节点是否等于给定节点中其一,同时其左右子树中等于给定节点的个数(具体的判定条件看思路)判定成立时将指针location指向当前节点。
4.注意若在递归过程中发现指针location已经不为null则直接退出递归

复杂度

时间复杂度:

O ( n ) O(n) O(n)

空间复杂度:

O ( n ) O(n) O(n)

Code

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {//用于记录指定节点最近的父节点位置private TreeNode location = null;/*** 求取二叉树中指定两节点的最近公共父节点(二叉树任意节点值无重复)** @param root 树的根节点* @param p    指定节点p* @param q    指定节点q* @return TreeNode*/public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {depthFirstSearch(root, p, q);return location;}/*** 深度优先(此处为二叉树的后序遍历)求取某一节点指定的* 节点p 与 q的个数,利用其找到最近父节点的位置* @param root 树的根节点* @param p    指定节点p* @param q    指定节点q* @return int*/private int depthFirstSearch(TreeNode root, TreeNode p, TreeNode q) {if (root == null) {return 0;}//当前节点左子树包含p,q节点的个数int leftContains = depthFirstSearch(root.left, p, q);//当已经找到location时提前退出if (location != null) {return 2;}//当前节点右子树包含p,q节点的个数int rightContains = depthFirstSearch(root.right, p, q);if (location != null) {return 2;}//记录当前节点值等于q或pint rootContain = 0;//如果当前节点值等于p,q其一if (root == p || root == q) {rootContain = 1;}/*找到情况1:当当前节点值等于p,q其一时,同时当前节点的左子树或右子树包含q,p的个数为1找到情况2:当当前节点的左子树包含一个p或q其一,同时当前节点的右子树包含一个q或p其一*/if (rootContain == 1 && (leftContains == 1 || rightContains == 1)) {location = root;}if (rootContain == 0 && leftContains == 1 && rightContains == 1) {location = root;}return leftContains + rightContains + rootContain;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于easy-es的聚合问题

es实体类&#xff1a; public class ChemicalES {IndexId(type IdType.CUSTOMIZE)private Long id;HighLightIndexField(fieldType FieldType.TEXT, analyzer "ik_max_word")private String name;IndexField(fieldType FieldType.KEYWORD)private List<Stri…

管易云与金蝶云星空对接集成其他出库查询连通其他出库新增(其他出库单)

管易云与金蝶云星空对接集成其他出库查询连通其他出库新增(其他出库单) 数据源系统:管易云 管易云是上海管易云计算软件有限公司旗下的专注提供电商企业管理软件服务的品牌&#xff0c;总部位于中国上海张江高科技产业园区。管易云旗下拥有管易云C-ERP、EC-OMS、EC-WMS、B2C/B2…

22款奔驰S400L升级原厂360全景影像 高清环绕 无死角

360全景影像影像系统提升行车时的便利&#xff0c;不管是新手或是老司机都将是一个不错的配置&#xff0c;无论是在倒车&#xff0c;挪车以及拐弯转角的时候都能及时关注车辆所处的环境状况&#xff0c;避免盲区事故发生&#xff0c;提升行车出入安全性。 360全景影像包含&…

DevExpress中文教程 - 如何在macOS和Linux (CTP)上创建、修改报表(下)

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 DevExpress Reports — 跨平台报表组件&#x…

【每日一题】2824. 统计和小于目标的下标对数目-2023.11.24

题目&#xff1a; 2824. 统计和小于目标的下标对数目 给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 target &#xff0c;请你返回满足 0 < i < j < n 且 nums[i] nums[j] < target 的下标对 (i, j) 的数目。 示例 1&#xff1a; 输入&#xff1…

基于命令行模式设计退款请求处理

前言 这篇文章的业务背景是基于我的另一篇文章: 对接苹果支付退款退单接口-CSDN博客 然后就是说设计模式是很开放的东西,可能我觉得合适,你可能觉得不合适,这里只是做下讨论,没有一定要各位同意的意思.... 相关图文件 这里我先把相关的图文件放上来,可能看着会比较清晰点 代码逻…

财报解读:三季度的美国零售,“沃尔玛效应”仍在持续

经济学中常用“沃尔玛效应”来指代“消费者减少消费时&#xff0c;会选择每种类别中价格最低的商品”这一现象。作为全球最大的零售商&#xff0c;沃尔玛一定程度上成为了消费市场的风向标。 近日&#xff0c;沃尔玛发布的2024财年第三季度财报显示&#xff0c;其相较去年同期…

c语言新龟兔赛跑

以下是一个使用C语言编写的新的龟兔赛跑游戏&#xff1a; #include <stdio.h>#include <stdlib.h>#include <time.h>int main() { int distance, turtle_speed, rabbit_speed, turtle_time, rabbit_time, rabbit_lead; srand(time(NULL)); // 随机数种…

数十亿美元商机!英国数字基础设施公司Equinix与法国量子计算公司Alice Bob 合作

​&#xff08;图片来源&#xff1a;网络&#xff09; 近日&#xff0c;全球数字基础设施公司Equinix宣布与全球领先的法国量子计算公司Alice & Bob合作&#xff0c;旨在共同开发市场上最为可靠的量子处理器之一。此次合作将使Equinix公司的客户通过使用Equinix Metal和Eq…

springboot+vue项目如何集成onlyoffice开源文档组件

一、onlyoffice是什么 ONLYOFFICE 是一个开源的办公套件&#xff0c;适合多人在线协作。由总部位于总部在拉脱维亚的 IT 公司Acensio System SIA 开发。它提供在线协作文档编辑器&#xff08;包括文档、电子表格、演示文稿和表单&#xff09;&#xff0c;适用于 Windows、Linu…

国标直流充电枪9孔分别啥意思?

DC&#xff1a;直流电源正 DC-&#xff1a;直流电源负 PE&#xff1a;接地&#xff08;搭铁&#xff09;S&#xff1a;通讯CAN-H S-&#xff1a;通讯CAN-L CC1&#xff1a;充电连接确认 CC2&#xff1a;充电连接确认 A&#xff1a;12V A-&#xff1a;12V- 以上就是国标直流充电…

synchronized的轻量级锁居然不会自旋?

《Java并发编程的艺术》中说到「如果失败&#xff0c;表示其他线程竞争锁&#xff0c;当前线程便尝试使用自旋来获取锁」&#xff0c;并且下文所配的流程图中明确表示自旋失败后才会升级为重量级锁&#xff0c;但《深入理解Java虚拟机》又说「如果出现两条以上的线程争用同一个…