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

题意理解:

        二叉树的最近公共祖先: 简单理解,就是p和q值的那两个节点,不断向上返回,然后会在一个点汇合,那么他们第一次汇合的这个点就是他们的最近公共祖先。

解题的思路就是:

        如果这一层找到了p或q的值,就向上一层返回。

        如果父节点的左右分别找了p、q节点,则返回父节点

        如果父节点占p、q中的一个,然后子树中找到一个,则返回父节点

        否则返回null

解题方法:

        其实就是树的话,一般都可以用递归和迭代两种方法的,就是这道题,用迭代比较难理解一点。

1.递归

先判断子树是否找到p、q值,再判断中间节点是否需要返回,所以处理顺序为: 左子树、右子树、中间节点——后续遍历

对于这道题来说,递归的思路看起来更为明确。

 /*** 什么是最近公共祖先?*      两个值节点合并到一棵树的那个祖先节点* 题目限制:树中没有重复值,p,q一定存在,这使得题目简单了不少* 思路:找到一个p|q,则向上返回,当遇到某个节点,左子树,右子树返回都不为null时,* 说明该节点是最近祖先,向上返回,* 最终返回最近祖先* @param root* @param p* @param q* @return*/public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {//由于题目限制,root一定不为null//由于需要对左右子树进行判断,然后对中间节点进行处理,故使用后序遍历:左右中//左处理TreeNode leftResult=root.left!=null?lowestCommonAncestor(root.left,p,q):null;//右处理TreeNode rightResult=root.right!=null?lowestCommonAncestor(root.right,p,q):null;//中间处理if(root.val==p.val||root.val==q.val) return root;//左右结果均不为空,则说明左右子树各找到一个目标值//  因为pq一定存在,p!=q,且树中没有重复值,故上述结论一定成立if(Objects.nonNull(leftResult)&&Objects.nonNull(rightResult)) return root;//左右找到一个,即该子树仅存在p|q中一个,继续向上返回else if(Objects.nonNull(leftResult)&&Objects.isNull(rightResult)) return leftResult;else if(Objects.isNull(leftResult)&&Objects.nonNull(rightResult)) return rightResult;//左右都没有找到,则说明该子树没有目标值,返回nullelse return null;/***   //中间处理逻辑精简*         if(root.val==p.val||root.val==q.val||(Objects.nonNull(leftResult)&&Objects.nonNull(rightResult))) return root;*             //左右找到一个,即该子树仅存在p|q中一个,继续向上返回*         else if(Objects.nonNull(leftResult)&&Objects.isNull(rightResult)) return leftResult;*         else if(Objects.isNull(leftResult)&&Objects.nonNull(rightResult)) return rightResult;*             //左右都没有找到,则说明该子树没有目标值,返回null*         else return null;*/}

2.迭代

不建议用迭代,理解太复杂,除非有要求。

这里需要两个栈,一个栈用来维护遍历树的操作。

另一个栈用来描述找到的节点在树种的位置关系,用来向上返回找到的值,且可以用来判断找到的两个节点是否在此处汇合。

eg:   null null null 3 9 null 即可表示要找的值在同一层,一个null表示即将出现一个中间节点,两值汇合后的下一个null出现时对应的中间节点,即为汇合点,即最近公共祖先。

//迭代public TreeNode lowestCommonAncestor2(TreeNode root, TreeNode p, TreeNode q) {//自定义栈-模拟递归Stack<TreeNode> stack=new Stack<>();//暂存找到的值,并指示层级Stack<TreeNode> resultStack=new Stack<>();stack.push(root);while(!stack.isEmpty()){TreeNode cur=stack.pop();if (Objects.nonNull(cur)) {//节点入栈stack.push(cur);stack.push(null);resultStack.push(null);//每加一个null相当于一层,用于只是层级//保证后序遍历的顺序入栈if(Objects.nonNull(cur.right)) stack.push(cur.right);if(Objects.nonNull(cur.left)) stack.push(cur.left);}else{//碰到中间节点cur=stack.pop();//该层有找到的值加入结果暂存层if(cur.val==p.val||cur.val==q.val){resultStack.push(cur);}TreeNode node=resultStack.pop();if(node!=null){//该层有找到的值if(resultStack.peek()!=null) return cur;//该层找到两个值else {resultStack.pop();//该层找到一个值,上移resultStack.push(node);}}}}return null;}

3.分析

时间复杂度:

        递归:O(n)

        迭代:O(n)

空间复杂度:

        递归:O(n)

        迭代:O(2n)

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

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

相关文章

Mac下更新python

1. 查看python版本 python3 -V2. 更新python版本 brew upgrade python3. 查看python3的路径&#xff1a; which python34. 修改.bash_profile文件 vim ~/.bash_profile插入python默认执行文件 alias python"/usr/local/bin/python3"5. 应用环境变量 source ~/.…

CRM与ERP如何协同服务于企业

在当今的商业环境中&#xff0c;客户关系管理&#xff08;CRM&#xff09;和 Enterprise Resource Planning&#xff08;ERP&#xff09;是两个不可或缺的系统。它们各自独立&#xff0c;但也可以协同工作&#xff0c;以提供更高效、更全面的企业解决方案。这种协同作用可以在销…

JAVA的一些便捷性方法(Object)

在IDEA中&#xff0c;如何查看JDK的源码&#xff1f; CTRL B; 常用方法&#xff1a; 1.equals&#xff08;&#xff09; booleanequals(Object obj) 指示其他某个对象是否与此对象“相等”。 与 的比较&#xff1a; &#xff0c;即可判断基本类型&#xff0c;也…

lodash中foreach踩坑

什么是lodash Lodash 是一个 JavaScript 实用工具库&#xff0c;提供了很多用于处理数据、简化开发等方面的功能。它提供了一组常用的工具函数&#xff0c;用于处理数组、对象、字符串等常见数据结构&#xff0c;同时也包含了一些函数式编程的工具。对于前端开发来说&#xff…

SAE-J1939协议入门解析

文章目录 前言一、SAE J1939物理层二、SAE J1939数据链路层1、帧结构1.1、帧起始&#xff08;SOF&#xff09;1.2、优先级&#xff08;P&#xff09;1.3、扩展数据页EDP&#xff08;R&#xff09;1.4、数据页&#xff08;DP)1.5、替换远程请求Substitute Remote Request &#…

JavaScript解构数组

还记得之前我们是如何读取到数组里面的元素的么&#xff1f; const arr [2, 3, 4]; const a arr[0]; const b arr[1]; const c arr[2];然后通过这个方式去读取数组中的数据&#xff1b; 现在我们可以使用解构赋值的方法去实现 const [x, y, z] arr; console.log(x, y, …

基于视觉传感器的自主扫雷机器人设计与实现

摘要&#xff1a; 在当今的世界安全形势下&#xff0c;扫雷小车的出现可以减少各国人员在扫雷过程中的人员伤亡&#xff0c;扫雷小车实用性能强更适合在军事化领域或者是民用领域上应用。让它具有光明的发展前景。针对这一情况&#xff0c;本毕业设计就对自主扫雷小车进行研究…

Windows系统如何远程控制Realme手机?

realme使用的是realme UI系统。realme UI是realme研发的操作系统&#xff1b;realme UI 1.0基于安卓10系统&#xff0c;realme UI 2.0基于安卓11系统&#xff0c;realme UI 3.0基于安卓12系统。 对于安卓4.0及以上系统的手机&#xff0c;都可以通过软件AirDroid实现远程控制。 …

【超强笔记软件】Obsidian如何实现免费无限流量无套路云同步?

【超强笔记软件】Obsidian如何实现免费无限流量无套路云同步&#xff1f; 文章目录 【超强笔记软件】Obsidian如何实现免费无限流量无套路云同步&#xff1f;一、简介软件特色演示&#xff1a; 二、使用免费群晖虚拟机搭建群晖Synology Drive服务&#xff0c;实现局域网同步1 安…

QHash使用介绍与代码演示

作者:令狐掌门 技术交流QQ群:675120140 csdn博客:https://mingshiqiang.blog.csdn.net/ 文章目录 一、QHash的基本用法二、QHash存储自定义类型三、QHash和QMap的区别QHashQMap使用场景QHash 是 Qt 框架中用于存储键-值对的哈希表实现。它提供了一种快速查找的方式,使得通过…

抖音自动评论助手,开发流程与需要到的技术和代码分享

先来看实操成果&#xff0c;↑↑需要的同学可看我名字↖↖↖↖↖&#xff0c;或评论888无偿分享 一、引言 随着互联网的快速发展&#xff0c;短视频平台已成为人们日常生活的重要组成部分。其中&#xff0c;抖音作为一款深受用户喜爱的短视频平台&#xff0c;拥有庞大的用户群体…

springMVC工作原理/流程

springMVC工作原理/流程 请描述Spring MVC的工作流程&#xff1f;描述一下 DispatcherServlet 的工作流程&#xff1f; &#xff08;1&#xff09;用户发送请求至前端控制器DispatcherServlet&#xff1b; &#xff08;2&#xff09; DispatcherServlet收到请求后&#xff0c;…

HarmonyOS开发:ArkTs常见数据类型

前言 无论是Android还是iOS开发&#xff0c;都提供了多种数据类型用于常见的业务开发&#xff0c;但在ArkTs中&#xff0c;数据类型就大有不同&#xff0c;比如int&#xff0c;float&#xff0c;double&#xff0c;long统一就是number类型&#xff0c;当然了也不存在char类型&…

【超全】C++速查手册:面向对象与继承多态

C速查手册 C 类和对象 面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠…

MySQL递归查询:洞悉数据的层层关联

在处理关系型数据库时&#xff0c;我们经常会遇到这样的情况&#xff1a;某些数据之间存在层级关系&#xff0c;例如目录、组织结构、评论等。在这些场景下&#xff0c;我们需要一种灵活的查询技术来处理这种层级关系。今天我们就来探讨MySQL中的递归查询&#xff0c;体验其独特…

yolov3学习总结

目标检测算法 单阶段&#xff1a;不提取出候选框&#xff0c;直接将整个图像输入模型中&#xff0c;算法直接输出检测结果&#xff0c;端到端 yolo&#xff0c;ssd 端到端&#xff0c;输入图像到网络中&#xff0c;然后从网络中输出图像 二阶段&#xff1a;先从图像中提取出…

白萝卜食品生产加工废水处理设备工艺流程

白萝卜食品生产加工废水处理设备工艺流程 白萝卜食品生产加工行业的快速发展&#xff0c;废水处理成为了一个解决的环境问题。为了实现废水的高效处理与资源化利用&#xff0c;成功开发出了一种高效的废水处理设备——“气浮机A/O二沉&#xff08;平流沉淀吸泥机/竖流沉淀斜管&…

紫光展锐Wi-Fi 6成功通过Wi-Fi联盟认证

近日&#xff0c;紫光展锐Wi-Fi 6产品成功通过Wi-Fi联盟 (简称“WFA”) Qualified Solution 认证&#xff0c;并支持Wi-Fi 6 Release 2&#xff0c;标志着紫光展锐自研Wi-Fi 6 IP技术已经成熟&#xff0c;在互操作性、安全性和一系列应用专有协议方面达到了国际行业标准。 WFA是…

自定义 element DatePicker组件指令 使选择器呈现为只读状态,用户无法直接编辑,但可以查看和选择日期

1.问题 现实中遇到列表的搜索条件使用DatePicker 组件进行开始结束时间筛选&#xff0c;但是手动修改input中的值&#xff0c;导致请求参数异常。比如讲clearable设置为false之后还是能手动清空输入框中的值。虽然组件提供了readonly 属性&#xff0c;但是也会让日期选择也无法…

【Flink进阶】-- Flink kubernetes operator 快速入门与实战

1、课程目录 2、课程链接 https://edu.csdn.net/course/detail/38831