C++算法入门练习——二叉树的最近公共祖先

现有一棵n个结点的二叉树(结点编号为从0n-1,根结点为0号结点),求两个指定编号结点的最近公共祖先。

注:二叉树上两个结点A、B​的最近公共祖先是指:二叉树上存在的一个结点P,使得P既是A的祖先,又是B的祖先,并且P​需要离根结点尽可能远(即层号尽可能大)。

解题思路:

想法肯定是递归查找,利用二叉树的性质:左儿子和右儿子,如果在某一根节点的左右儿子找到了,说明该根节点为公共节点。如何实现最近呢?

利用递归的性质,然后自顶向下搜索,如果找到了就return即可。

完整代码如下:

//二叉树的最近公共祖先
#include <iostream>
#include <vector>
using namespace std;

const int MAXN = 50;

struct node{
	int lchild;
	int rchild;
}nodes[MAXN]; 

int LCA(int root,int p,int q){
	if(root == -1){
		return -1;
	}
	if(root ==p || root == q){
		return root;
	}
	int leftResult = LCA(nodes[root].lchild,p,q);
	int rightResult = LCA(nodes[root].rchild,p,q);
	if(leftResult!=-1&&rightResult!=-1){//如果根节点的左右儿子中都找到了,说明该根即为公共节点。 
		return root;
	}
	else if(leftResult!=-1){
		return leftResult;
	}
	else if(rightResult!=-1){
		return rightResult;
	}
}

int main(){
	int n,p,q;
	cin>>n>>p>>q;
	for(int i=0;i<n;i++){
		cin>>nodes[i].lchild>>nodes[i].rchild;
	}
	cout<<LCA(0,p,q);
	return 0;
}

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值