力扣(LeetCode)236. 二叉树的最近公共祖先(Java)

news/2024/11/20 11:22:59/

一、目标

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

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

二、代码解读

总体代码:

本题是寻找一个节点的最近公共祖先,一定选择的是后序遍历。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {//递归终止条件if(root == null){return null;}//如果遇到了p或者q就返回当前节点if(root == p || root == q){return root;}TreeNode left = lowestCommonAncestor(root.left, p, q);TreeNode right = lowestCommonAncestor(root.right, p, q);//分别处理不同情况if(left != null && right != null){return root;}if(left == null && right != null){return right;}if(left != null && right == null){return left;}return null;}
}

递归第一步:递归终止条件

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {//递归终止条件if(root == null){return null;}

递归第二步:确定单层逻辑

要选择后序遍历,每次要接住处理后返回的节点(或者是null),每次如果找到了p或者q,则return回当前节点,如果找不到就直到走到叶子节点时开始处理,处理逻辑为:

每次回溯的时候会判断是不是p或者q,是的话返回

如果左右当前节点左右都不为空,说明下面已经找到,直接return当前的root

如果左右有一个不为空,则返回那个不为空的

        if(root == p || root == q){return root;}TreeNode left = lowestCommonAncestor(root.left, p, q);TreeNode right = lowestCommonAncestor(root.right, p, q);//分别处理不同情况if(left != null && right != null){return root;}if(left == null && right != null){return right;}if(left != null && right == null){return left;}return null;

三、总结

本题设计回溯,值得深思


http://www.ppmy.cn/news/1548478.html

相关文章

在openi平台 基于华为顶级深度计算平台 openmind 动手实践

大家可能一直疑问,到底大模型在哪里有用。 本人从事的大模型有几个方向的业务。 基于生成式语言模型的海事航行警告结构化解析。 基于生成式语言模型的航空航行警告结构化解析。 基于生成式生物序列(蛋白质、有机物、rna、dna、mrna)的多模态…

逻辑回归LR(Logistic Regression)原理以及代码实践

逻辑回归LR(Logistic Regression)原理以及代码实践 简介 逻辑回归应该算得上是机器学习领域必须掌握的经典算法之一,并且由于其简单有效、可并行化、可解释性强等优点,至今仍然也是分类问题中最基础和最受欢迎的算法之一。尽管它的名字里面有“回归”两…

第四章springboot视图技术

springboot为啦简化项目的开发,提供啦试视图技术,主要推荐整合 模板引擎技术,实现前端页面的动态化内容。本章对springboot的视图技术进行介绍,并用springboot整合常用的Thymeleaf模板引擎,进行视图页面的实现。 4.1 s…

科技赋能-JAVA发票查验接口、智能、高效的代名词

对于企业而言,确保发票的真实性和合法性,不仅关系到企业的运营风险,也直接影响到企业的信用和财务健康。翔云发票查验接口是一款通过API接口连接的发票真伪验证功能。它可以与企业的财务系统无缝对接,实现自动化的发票查验&#x…

react 中 useEffect Hook 作用

useEffect是一个用于处理副作用(Side Effects)的 Hook 一、处理副作用 1. 副作用的概念 副作用是指在组件渲染过程中执行的、会影响组件外部环境或具有外部可见影响的操作。 常见的副作用包括数据获取(如从服务器获取数据)、订…

### 哋它亢在5G基站中的应用:新兴技术与未来通信的融合

文章目录 1. 什么是“哋它亢”?2. 哋它亢的原理与优势3. 哋它亢在5G基站中的应用场景4. 哋它亢技术的挑战与未来展望 随着通信技术的不断发展,我们迎来了5G时代,这为我们的日常生活带来了诸多变化。5G不仅提升了网络速度,还为各种…

枚举与lambda表达式,枚举实现单例模式为什么是安全的,lambda表达式与函数式接口的小九九~

目录 认识枚举 全文重点:枚举在单例模式中为什么是安全的? Lambda 表达式 概念: 函数式接口 lambda表达式的基本使用: lambda表达式的语法精简: lambda表达式的变量捕获 Lambda在集合当中的使用 在 Collecti…

论文翻译 | Learning to Transfer Prompts for Text Generation

摘要 预训练语言模型(PLMs)通过微调在文本生成任务中取得了显著进展。然而,在数据稀缺的情况下对plm进行微调是具有挑战性的。因此,开发一个通用的、轻量级的、能够适应各种基于plm的文本生成任务的模型是非常重要的。为了实现这一…