leetcode236.二叉树的最近公共祖先

ops/2024/12/20 0:11:48/

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

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

示例 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 。因为根据定义最近公共祖先节点可以为节点本身。

示例 3:

输入:root = [1,2], p = 1, q = 2
输出:1

提示:

  • 树中节点数目在范围 [2, 105] 内。
  • -109 <= Node.val <= 109
  • 所有 Node.val 互不相同 。
  • p != q
  • p 和 q 均存在于给定的二叉树中。

思路:分别记录p和q祖先,确定一个节点是否加入到祖先列表的规则是 :如果该节点是target或者该节点左右子树包含target

java"> List<TreeNode> lis_p=new ArrayList<>();// 记录p所有祖先List<TreeNode> lis_q=new ArrayList<>();// 记录q所有祖先public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {search(root,p,lis_p); //search(root,q,lis_q);for(int i=lis_p.size()-1;i>=0;i--){// 由于要找最近公共祖先,因此要从后往前遍历祖先列表if(lis_q.indexOf(lis_p.get(i))>=0)return lis_p.get(i);}return null;}// 确定一个节点是否加入到祖先列表的规则是 :如果该节点是target或者该节点左右子树包含targetpublic boolean search(TreeNode root,TreeNode target,List<TreeNode> list) {if(root==null)return false;list.add(root);if(root==target){return true;}if(search(root.left,target,list)||search(root.right,target,list))return true;list.remove(list.size()-1);// 踢出祖先列表return false;}


http://www.ppmy.cn/ops/143323.html

相关文章

Springboot家政服务管理系统

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

vue3中provide 、inject的比较

引言 在 Vue 3 中,provide 和 inject 是用于在组件之间共享数据的 API。这种机制允许父组件向其子组件提供数据,而不需要通过 props 一层层传递。以下是对 provide 和 inject 的详细解释以及示例代码。 provide 和 inject 的工作原理 provide:在父组件中使用,允许…

Rust中自定义Debug调试输出

在 Rust 中&#xff0c;通过为类型实现 fmt::Debug&#xff0c;可以自定义该类型的调试输出。fmt::Debug 是标准库中的一个格式化 trait&#xff0c;用于实现 {:?} 格式的打印。这个 trait 通常通过自动派生&#xff08;#[derive(Debug)]&#xff09;来实现&#xff0c;但你也…

Ilya Sutskever发表了对AI未来发展的颠覆性看法

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

社区生活超市系统|Java|SSM|JSP|

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、JSP、jquery,html 5⃣️数据库可…

安全计算环境-(一)路由器-1

安全计算环境-网络设备 安全管理中心针对整个系统提出了安全管理方面的技术控制要求&#xff0c;通过技术手段实现集中管理&#xff1b;涉及的安全控制点包括系统管理、审计管理、安全管理和集中管控。以下以三级等级保护对象为例&#xff0c;描述安全管理中心各个控制要求项的…

蓝桥杯刷题——day5

蓝桥杯刷题——day5 题目一题干解题思路一代码解题思路二代码 题目二题干解题思路代码 题目一 题干 给定n个整数 a1,a2,⋯ ,an&#xff0c;求它们两两相乘再相加的和&#xff0c;即&#xff1a; 示例一&#xff1a; 输入&#xff1a; 4 1 3 6 9 输出&#xff1a; 117 题目链…

如何实现接口继承与实现继承的区别?

接口继承 接口继承是指子类只继承基类的纯虚函数&#xff0c;即只继承基类的接口&#xff0c;而不继承基类的实现&#xff0c;子类必须实现基类中的所有纯虚函数&#xff0c;否则子类也成为抽象类 #include<iostream> using namespace std; // 纯虚类&#xff0c;用作接…