【14】最近公共祖先问题

简介: 题目:给定一颗二叉树的两个结点,求这两个结点的最近公共祖先结点 分析:1. 假如二叉树是二叉排序树                根据二叉排序树的性质,左子树结点的值小于根结点,根结点的值小于右子树结点的值             ...


题目:给定一颗二叉树的两个结点,求这两个结点的最近公共祖先结点


分析:1. 假如二叉树是二叉排序树

               根据二叉排序树的性质,左子树结点的值小于根结点,根结点的值小于右子树结点的值

               那么每次只要判断,给定的两个结点的值和左右结点的值比较即可

               如果两个值都小于根结点的值,则递归到左子树

               如果两个值都大于根结点的值,则递归到右子树

               否则根结点即为最近公共祖先

            2. 如果二叉树不是排序二叉树,那么二叉树如果有一个指向父节点的指针,则题目变成求”给定两个结点,从两个结点到根结点这两条路径的第一个公共结点“和链表求公共结点一样


下面给出两种情况的代码

1. 二叉树是排序二叉树

//二叉树结点
struct BinaryTreeNode{
    int value;
	BinaryTreeNode *lsonNode;
	BinaryTreeNode *rsonNode;
};

//二叉排序树找最近公共祖先
BinaryTreeNode* FindCommonNode(BinaryTreeNode *root
	, BinaryTreeNode *nodeOne, BinaryTreeNode *nodeTwo){
	
	if(root == NULL || nodeOne == NULL || nodeTwo == NULL){
	   return NULL;
	}
	if((root->value > nodeOne->value) 
		&& (root->value > nodeTwo->value)){ //递归到左子树
		return FindCommonNode(root->lsonNode, nodeOne, nodeTwo);
	}
	else if((root->value < nodeOne->value) 
		&& (root->value < nodeTwo->value)){ //递归到右子树
			return FindCommonNode(root->rsonNode, nodeOne, nodeTwo);
	}
	else{ //当前点即为最近公共祖先
	    return root;
	}
}

2. 二叉树不是排序二叉树但是又指向父节点的指针

//二叉树的结点
struct BinaryTreeNode{
    int value;
	BinaryTreeNode *lsonNode;
	BinaryTreeNode *rsonNode;
	BinaryTreeNode *fatherNode;
};

//找最近公共祖先
BinaryTreeNode* FindCommonNode(BinaryTreeNode *root, 
	BinaryTreeNode *nodeOne, BinaryTreeNode *nodeTwo){
	if(root == NULL || nodeOne == NULL || nodeTwo == NULL){
	    return NULL;
	}
	//求出两个结点到根结点root的长度
	int lenNodeOne = 0;
	int lenNodeTwo = 0;

	BinaryTreeNode *tmpNode = nodeOne;
	while(tmpNode != NULL){
	    ++lenNodeOne;
		tmpNode = tmpNode->fatherNode;
	}
	tmpNode = nodeTwo;
	while(tmpNode != NULL){
	    ++lenNodeTwo;
		tmpNode = tmpNode->fatherNode;
	}
	//让长的链先走几步
	BinaryTreeNode *pNodeOne = nodeOne;
	BinaryTreeNode *pNodeTwo = nodeTwo;
	if(lenNodeOne > lenNodeTwo){
		while(lenNodeOne > lenNodeTwo){
		     --lenNodeOne;
			 pNodeOne = pNodeOne->fatherNode;
		}
	}
	else{
	    while(lenNodeOne < lenNodeTwo){
		     --lenNodeTwo;
			 pNodeTwo = pNodeTwo->fatherNode;
		}
	}
	//两个指针一起走
	while((pNodeOne != pNodeTwo) && (pNodeOne != NULL) && (pNodeTwo != NULL)){
		pNodeOne = pNodeOne->fatherNode;
		pNodeTwo = pNodeTwo->fatherNode;
	}
	//如果两个相等说明有公共结点
	if(pNodeOne == pNodeTwo){
	    return pNodeOne;
	}
	else{
	    return NULL;
	}
}


目录
相关文章
|
2天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
3天前
|
云安全 数据采集 人工智能
古茗联名引爆全网,阿里云三层防护助力对抗黑产
阿里云三层校验+风险识别,为古茗每一杯奶茶保驾护航!
古茗联名引爆全网,阿里云三层防护助力对抗黑产
|
4天前
|
存储 机器学习/深度学习 人工智能
大模型微调技术:LoRA原理与实践
本文深入解析大语言模型微调中的关键技术——低秩自适应(LoRA)。通过分析全参数微调的计算瓶颈,详细阐述LoRA的数学原理、实现机制和优势特点。文章包含完整的PyTorch实现代码、性能对比实验以及实际应用场景,为开发者提供高效微调大模型的实践指南。
520 1
kde
|
4天前
|
人工智能 关系型数据库 PostgreSQL
n8n Docker 部署手册
n8n是一款开源工作流自动化平台,支持低代码与可编程模式,集成400+服务节点,原生支持AI与API连接,可自托管部署,助力团队构建安全高效的自动化流程。
kde
352 3
|
2天前
|
Linux 虚拟化 iOS开发
VMware Workstation Pro 25H2 for Windows & Linux - 领先的免费桌面虚拟化软件
VMware Workstation Pro 25H2 for Windows & Linux - 领先的免费桌面虚拟化软件
708 4
VMware Workstation Pro 25H2 for Windows & Linux - 领先的免费桌面虚拟化软件
|
2天前
|
JavaScript 开发工具 Android开发
如何在原生 App 中调用 Uniapp 的页面?
如何在原生 App 中调用 Uniapp 的页面?
240 138
|
3天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段四:学术分析 AI 项目 RAG 落地指南:基于 Spring AI 的本地与阿里云知识库实践
本文介绍RAG(检索增强生成)技术,结合Spring AI与本地及云知识库实现学术分析AI应用,利用阿里云Qwen-Plus模型提升回答准确性与可信度。
249 91
AI 超级智能体全栈项目阶段四:学术分析 AI 项目 RAG 落地指南:基于 Spring AI 的本地与阿里云知识库实践