现有一棵n个结点的二叉树(结点编号为从0
到n-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;
}