面试经典(5)--二叉树最低公共祖先LCA

树中两结点的最低公共祖先(C++实现) 题目是,输入两个树结点,求它们的最低公共祖先 首先,要说明的是,这是一组题目,根据剑指Offer上所讲的,这道题可能会分好几种情况,因此,如果在面试时候遇到,我们需要和面试官沟通,而不是一上来就写代码。1. 如果给定树是二叉搜索树二叉搜索树(又叫二叉排序树),中序遍历是可以得到有序序列的,因此,我们可以利用这个性质来解题。假设给定的两个树结点为4,1,根据图示,显然3为最低公共祖先; 假设给定的两 阅读详情

题目:输入二叉树的俩个节点,求它们的最低公共祖先

算法分析:我们直接来分析O(n)的算法。


比如求节点F和节点H的最低公共祖先,先求出从根节点A到F的路径,再求出A到H的路径,那么最后一个相同的节点就是最低公共祖先。A->B->D->F和A->B->E->H,最后相同的节点事B,所以最低公共祖先是B节点。求根节点到指定节点的算法先前已经更新过了,复杂度是O(n),所以总的时间复杂度是O(n)。

获取从根节点到指定节点的函数代码:

struct BinaryNode
{
	char value;
	BinaryNode *left;
	BinaryNode *right;
};
求跟节点到指定节点路径:

bool GetNodePath(BinaryNode *pRoot,BinaryNode *pNode,vector<BinaryNode*> &v)
{
	if(pRoot==NULL)
		return false;
	v.push_back(pRoot);
	if(pRoot==pNode)
		return true;
	bool found=GetNodePath(pRoot->left,pNode,v);
	if(!found)
		found=GetNodePath(pRoot->right,pNode,v);
	if(!found)
		v.pop_back();
}

求最低公共祖先节点:

BinaryNode* GetCommonParent(BinaryNode *pRoot,BinaryNode *pNode1,BinaryNode *pNode2)
{
	if(pRoot==NULL || pNode1==NULL || pNode2==NULL)
		return NULL;
	vector<BinaryNode*> v1,v2;
	GetNodePath(pRoot,pNode1,v1);
	GetNodePath(pRoot,pNode2,v2);
	BinaryNode *pLast=pRoot;
	vector<BinaryNode*>::iterator ite1=v1.begin();
	vector<BinaryNode*>::iterator ite2=v2.begin();
	while(ite1!=v1.end() && ite2!=v2.end())
	{
		if(*ite1==*ite2)
			pLast=*ite1;
		ite1++;
		ite2++;
	}
	return pLast;
}




二叉树最近公共祖先(LCA)问题详解与实现 最近公共祖先(LCA)是树结构中的基础算法问题,指在二叉树中找到两个节点的最低共同祖先节点。该算法基于树的后序遍历原理,通过递归或迭代方式实现,时间复杂度为O(n)。在工程实践中,LCA算法广泛应用于版本控制系统(如Git分支合并)、DOM树操作、文件系统路径分析等场景。递归解法代码简洁但可能存在栈溢出风险,而迭代解法通过父节点哈希表记录更适用于深度较大的树结构。掌握LCA算法不仅能提升树结构问题的解决能力,也是面试中二叉树类问题的常见考点。 阅读详情

相关推荐

自动驾驶系统架构解析:从传感器到决策控制的完整链路(附实际案例)

本文深入解析了自动驾驶系统从感知、决策到控制的完整架构链路。通过对比摄像头、毫米波雷达、激光雷达等核心传感器的特性与选型策略,阐述了多传感器融合的必要性。文章结合行为决策、运动规划及控制执行的实际案例,揭示了系统集成、数据闭环与功能安全等工程化落地的关键挑战,为理解自动驾驶技术提供了清晰的蓝图。

weixin_29051811的博客 338

二叉树——LCA问题

二叉树寻找最近公共祖先问题

chenchenchencl的博客 3849

运放 + MOS管构成的恒流电路分析及实用环境器件参数选择

恒流电路

五花带点肉 2万+

二叉树的最近公共祖先LCA

LCA最近公共祖先

FairLikeSnow的博客 771

SEED-VII 实战指南:如何利用多模态脑电图数据提升情感识别精度

本文提供了SEED-VII多模态脑电图数据集的实战指南,详细介绍了如何利用该数据集提升情感识别精度。内容涵盖数据获取、预处理、特征提取,以及构建多模态融合神经网络模型的关键步骤,并强调了被试者独立评估的重要性,为情感计算研究者提供了从数据到模型的全流程解决方案。

weixin_29196891的博客 316

【机器学习—评估指标】混淆矩阵、准确率、精确率、召回率、F1分数、ROC曲线和AUC

机器学习评价指标是衡量模型性能的关键工具。本文介绍了常见指标及其计算方法:1.混淆矩阵展示分类预测结果分布,包含TP、TN、FP、FN四个基础指标;2.准确率反映整体预测正确率;3.精确率关注预测正例的准确性;4.召回率衡量正例检出能力;5.F1分数综合平衡精确率和召回率;6.ROC曲线通过TPR与FPR的权衡关系评估模型性能,AUC值量化区分能力。文章详细说明了各指标的定义、计算公式、适用场景及局限性,并通过Python代码示例演示了具体实现方法,特别对ROC曲线和AUC的计算原理进行了深入解析。

weixin_51375278的博客 6744

最近公共祖先(LCA)

最近公共祖先(LCA) 1. 最近公共祖先原理 原理 LCA问题:在一棵有根树中,一个节点的祖先节点是指它本身或者它父节点的祖先。给定两个节点,两个点共同的祖先中距离两者最近的节点就是这两个节点的最近公共祖先。需要注意的是最近公共祖先可能是这两个节点中的某一个。 LCA问题的解法有很多种,下面介绍四种,其中第二种、第三种最常用 1. 向上标记法 做法:求两个节点p、q的最近公共祖先原理,可以任选一个点,比如点p,沿着点p向上走,将走过的节点标记为true,代表已经走过,走到根节点后停止;然后让q

weixin_42638946的博客 8023

L3 级自动驾驶 2025:法规突破与车企技术路线竞争

2025年L3级自动驾驶迎来规模化商业落地关键期。全球主要经济体在法规、技术、市场三方面取得突破:中国通过《北京市自动驾驶汽车条例》明确责任划分,欧盟设立严格技术认证标准。技术路线呈现"多传感器融合为主流,纯视觉为补充"格局,华为、特斯拉等企业展开硬件军备竞赛与算法架构革新。中国车企在技术验证和规模化应用方面领先,而欧美车企侧重生态整合。尽管面临成本控制、责任认定和用户信任等挑战,随着技术进步和车路协同发展,L3自动驾驶正从高端选配向大众化普及迈进,为L4级奠定基础。

2301_77933942的博客 3097

每日算法总结——寻找二叉树最低公共祖先、在二叉树中找到一个节点的后继节点、二叉树的序列化和反序列化,折纸问题

以。

qq_53661372的博客 516

基于LSTM算法实现交通流量预测(Pytorch版)

本研究采用PyTorch框架,设计并实现了一种基于LSTM(Long Short-Term Memory)网络的交通流量预测模型。针对时序性显著的交通流量数据,模型首先将多节点、多通道的时空信息整合为一维特征输入至多层LSTM单元,利用其捕捉长期依赖及短期波动的能力进行深度学习。全连接层随后调整时间步长以适应预测周期需求。模型结构灵活,能适应不同节点数、输入输出长度及通道配置,实现在给定历史流量数据基础上对未来交通流量的精准预测,为交通管理与规划提供数据驱动支持。

打酱油的葫芦娃 4637

PR工具timing report中setup time的计算过程

然后去pr工具里报告report_delay_calculation/reportDelayCalculation -from related_pin -to constraint_pin。这里constraint pin就是D pin (D0 D1 D2 D3),related pin就是 CK pin。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 454

二叉树——最低公共祖先

【代码】二叉树——最低公共祖先。

马力的博客 272

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

二叉树中查找两个节点的最低公共祖先

这是一道企业面试中,经常会被问到的面试题目。 在网上看到一些此题的实现,其中有两种方法是比较适合编程的。本项目的源代码,请点击这里下载。 方法一:   此方法是根据二叉树的DFS查找并标记祖先,根据递归出栈的原理,找到公共祖先。   其主要代码如下: 1 #include <iostream> 2 #include <list> 3 #in...

216

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【LeetCode 面试经典150题】236. Lowest Common Ancestor of a Binary Tree 二叉树的最近公共祖先

根据维基百科上对LCA的定义:“最低公共祖先是指在T中既是节点p的祖先又是节点q的祖先的最低节点(我们允许一个节点是其自身的后代)。解释: 节点 5 和节点 4 的最低公共祖先是 5,因为根据LCA定义,一个节点可以是其自身的后代。给定一个二叉树,找到树中两个给定节点的最低公共祖先(LCA)。该方法使用递归来查找二叉树中两个节点的最低公共祖先(LCA)。解释: 节点 5 和节点 1 的最低公共祖先是 3。

qq_43513394的博客 550

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Leetcode-236. Lowest Common Ancestor of a Binary Tree 最小公共祖先

Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two node

Much effort, much prosperity. 371

015-算法面试必备-LCA问题(longest common ancestor,最小公共祖先)

本文探索的是经典的最小公共祖先问题。 对应的是leetcode235,236题。   这种递进方式的问题在面试中非常见,先来个easy的,然后加条件,越来越难,比如后面的LCS问题(longest common sequence,最大公共序列)   leetcode,235题描述如下: 给定一个二分搜索树,给两个节点,找到这两个节点的最小公共祖先。 比如给定如下的二叉树: ...

u013385925的专栏 534

[JAVA]寻找最低公共祖宗结点

题目来源:leetcode 题目描述: Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According to the definition of LCA on Wikipedia: “The lowest common ancestor is define...

weixin_34080571的博客 287

面试题之树中两个节点的最低公共祖先节点

1.树为二叉搜索树,二叉搜索树特点:值:右>根>左 ①思路 从根节点开始遍历 a:若该节点值比所给两个节点均大,则公共祖先节点必在其左子树上,遍历其左子树。 b:若该节点值比所给两个节点均小,则公共祖先节点必在其右子树上,遍历其右子树。 c:直到找到一个节点,位于两节点的中间。 Given a binary search tree(BST),find the lowest comm

hellorichen的专栏 696

二叉树最近公共祖先(LCA)算法详解与面试应用

最近公共祖先(LCA)是树结构中的基础算法问题,指在二叉树中找到两个节点的最低层级共同祖先。该算法基于深度优先搜索(DFS)或广度优先搜索(BFS)实现,核心在于递归思想与路径回溯。从技术价值看,LCA不仅是算法面试高频考点(如LeetCode 236题),更在数据库锁管理、文件系统权限控制等工程场景有实际应用。典型的解决方案包括时间复杂度O(n)的递归法,以及使用父指针哈希的迭代优化版本。掌握LCA算法有助于深入理解二叉树遍历、递归与迭代转换等核心概念,是提升算法能力的必经之路。

weixin_42548893的博客 268

面试题68:树中两个结点的最低公共祖先

一、题目 输入两个树结点,求它们的最低公共祖先。 二、关键   三、解释 1.第一种类型的题目:如果是在二叉树中找出两个树节点。则解题思路如下:二叉搜素树都是经过排序的,位于左子树的节点都比父节点小,位于右子树的节点都比父节点大,我们只需要从树的根节点开始和两个输入的节点进行比较。如果当前节点的值比两个节点的值都大,那么最低的共同父节点一定在当前节点的左子树中,于是下一步遍历当前节点的左...

u012197749的博客 405

【剑指offer】 面试题50: 树中两个结点的最低公共祖先

题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先。 方法一: 后序遍历   基本思想: 1、两个节点不在一条线上(即两个节点不存在一个节点是另一个节点的祖先的情况),则它们必定分别在所求节点A的左子树和右子树上, 后序遍历到第一个满足这个条件的节点就是所要求的节点A。 2、当

执子之手 944

二叉树遍历、查找、深度等

self.left = left # 左子节点self.right = right # 右子节点这个类定义了一个二叉树节点,其中每个节点包含一个值 (value) 和左右两个子节点 (left和right),默认值为None。以上是 Python 3.11 中关于二叉树的基本实现和一些常见的面试题。你可以根据具体的面试要求选择合适的算法,并根据问题的不同需求进行适当的优化。

科技追踪者的专栏 612
上一篇: 面试经典(6)--连续子数组最大和--二维
下一篇: 面试经典(4)--链表逆序
OS技术解密
博客等级 码龄16年 3760粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值