12.30 二叉树中等题

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

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

百度百科中最近公共祖先的定义为:“对于有根树 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 。因为根据定义最近公共祖先节点可以为节点本身。

思路1:

要让depth尽可能大,则如果从底向上去遍历节点,那第一个满足是p、q公共祖先的节点即是答案

细节:后序遍历是从底向上遍历二叉树

采用递归方法进行后序遍历:

1.递归结构:

        TreeNode* left = lowestCommonAncestor(root->left, p, q);TreeNode* right = lowestCommonAncestor(root->right, p, q);//再判断该节点是否为P、q公共祖先节点

终止递归的条件:root==nullptr

判断是否为P、Q的祖先节点:判断left和right是否为null并重新写一个isChild进行递归判断,

class Solution {
public:bool isChild(TreeNode* root,TreeNode* target){if(root==target) return true;else if(root==NULL) return false;return isChild(root->left,target) || isChild(root->right,target);}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (root == NULL) return root;TreeNode* left = lowestCommonAncestor(root->left, p, q);TreeNode* right = lowestCommonAncestor(root->right, p, q);//再判断该节点是否为P、q公共祖先节点if(left!=NULL) return left;else if(right!=NULL) return right;else if(isChild(root,p)&&isChild(root,q)) return root;return NULL;}
};

这段代码的时间复杂度是O(N^2),其中N是二叉树中节点的数量。原因是在lowestCommonAncestor函数中,对于每个节点都会调用isChild函数,而isChild函数的时间复杂度是O(N),因为它需要递归遍历整个树来查找目标节点。

下面这个方法的复杂度为o(N)。

思路2:

代码随想录 (programmercarl.com)

要让depth尽可能大,则如果从底向上去遍历节点,那第一个满足是p、q公共祖先的节点即是答案

细节:后序遍历是从底向上遍历二叉树

采用递归方法进行后序遍历:

递归结构:

        TreeNode* left = lowestCommonAncestor(root->left, p, q);TreeNode* right = lowestCommonAncestor(root->right, p, q);//再判断该节点是否为P、q公共祖先节点

终止递归的条件:root==nullptr或==p或==q

        if (root == q || root == p || root == NULL) return root;TreeNode* left = lowestCommonAncestor(root->left, p, q);TreeNode* right = lowestCommonAncestor(root->right, p, q);//再判断该节点是否为P、q公共祖先节点

判断该节点是否为P、q公共祖先节点可以利用返回的left、right值:

left、right的取值有四种情况:

1.left right 都为nullptr

则该root不是p q的祖先节点

2.left 为nullptr而right不为nullptr

则left不会是 p q的祖先节点,right可能是

3.right 为nullptr而left不为nullptr

则right不会是 p q的祖先节点,left可能是

4.left right 都不为nullptr

则root一定为 p 、q的公共祖先节点。该root返回到上一层递归中时,与该root对应的兄弟节点一定会是nullptr,则继续返回该root,直到第一层。

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (root == q || root == p || root == NULL) return root;TreeNode* left = lowestCommonAncestor(root->left, p, q);TreeNode* right = lowestCommonAncestor(root->right, p, q);//再判断该节点是否为P、q公共祖先节点if (left != NULL && right != NULL) return root;if (left == NULL) return right;return left;}
};

在最坏情况下,需要遍历整个二叉树,因此时间复杂度是O(N),其中N是二叉树中节点的数量。

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

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

相关文章

嵌入式学习路线

嵌入式系统是一种将软件和硬件紧密结合的技术,首先我们要认识到,无论我们是专注于软件开发还是硬件开发,最终的目标都是为了更好的工作和职业发展。 根据企业的规模和需求,大公司更倾向于将职责分得更细,例如软件分为…

MySQL例行检查

MySQL例行检查 1.实例例行检查1.1线程1.2索引1.3临时表1.4连接数1.5BINLOG1.6锁1.7WAIT事件1.8MySQL状态 2.事务与锁例行检查2.1查看索引的cardinality2.2查看是否存在事务阻塞现象2.3查看事务执行时长以及执行的所有SQL2.4事务与锁 3.库表例行检查3.1查看缺失主键的表3.2冗余索…

学Python的正确顺序千万别弄反了,到时候后悔就来不及了

学Python的正确顺序:从基础到高级,步步为营 在当今数字化时代,Python已成为最受欢迎的编程语言之一。它不仅广泛应用于数据分析、人工智能和Web开发等领域,还为初学者提供了一个友好且功能强大的平台。然而,学习Python…

三角函数两角和差公式推导

一.几何推理 1.两角和公式 做一斜边为1的直角△ABC,任意旋转非 k Π , k N kΠ,kN kΠ,kN,补充如图,令 ∠ A B C ∠ α , ∠ C B F ∠ β ∠ABC∠α,∠CBF∠β ∠ABC∠α,∠CBF∠β ∴ ∠ D B F ∠ D B A ∠ α ∠ β 90 , ∠ D A …

人工神经网络

前言 人工神经网络(Artificial Neural Network,ANN),通常简称为神经网络,是一种在生物神经网络的启示下建立的数据处理模型。神经网络由大量的人工神经元相互连接进行计算,根据外界的信息改变自身的结构,主要通过调整…

Stable Diffusion WebUI制作光影文字效果

在huggingface上下载control_v1p_sd15_brightness模型。 将模型放在stable-diffusion-webui\extensions\sd-webui-controlnet\models目录下。 SD参数配置 正向提示词: city,Building,tall building,Neon Light, gentle light shines through, anime style, paint…

python的pywebio库给孩子做加减法数学题

效果展示 程序执行后,打开浏览器,展示一些100以内的加减法混合运算的数学题并输入答案后判断对错,这样倒是省了买教材的钱了。 在题目下方的框中,输入答案,然后点击提交后, 会输出结果 pywebio库介绍 安装…

谷歌Linux内核自动测试平台架构介绍-用自动测试测试难以测试的问题

1 摘要 内核和硬件等低级系统已被证明极难进行有效测试,因此,许多内核测试都是以手动为主方式进行的。现有的大多数测试框架都是为测试与底层平台隔离的高级软件而设计的,而底层平台被假定是稳定可靠的。测试底层平台本身需要一套全新的假设…

⑩①【缓存】Redis持久化 RDB + AOF

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ ⑩①Redis持久化 RDB AOF Redis数据快照 - RD…

70内网安全-域横向内网漫游Socks代理隧道技术(下)

这节课解决代理的问题, 他是内网里面的穿透技术,隧道主要安全设备和流量监控的拦截问题,我们在做渗透的时候需要回显数据或者一些重要的信息,走的协议不一样,tcp/ip有七层, 在不同层里面有不同的协议&…

vue3关于Echarts的简单使用及配置

前言: ECharts,一个使用 JavaScript 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE9/10/11,Chrome,Firefox,Safari等),底…

浅谈冯诺依曼体系和操作系统

🌎冯诺依曼体系结构 文章目录 冯诺依曼体系结构 认识冯诺依曼体系结构       硬件分类       各个硬件的简单认识         输入输出设备         中央处理器         存储器 关于内存 对冯诺依曼体系的理解 操作系统 操作系统…