求出任意两个节点的最近公共祖先节点
算法思想:
将这两个节点的所有祖先节点从下至上依次存放到两个数组中,然后遍历这两个数组,第一个相等的值便是所求值。
#include<stdio.h>
#define maxsize 100
typedef struct PTNode
{
char data;
int parent;
}PTNode;//树的节点结构
typedef struct PTree
{
PTNode Tnodep[maxsize];
int n;//树的节点个数
}PTree;//树
PTree CreatePTree();
char GetCommonGrand(char ,char ,PTree);
//建树
PTree CreatePTree()
{
int i,n;
char data;
int parentId;
PTree newTree;
scanf("%d",&n);
newTree.n=n;
getchar();
//循环输入树的节点信息
for(i=0;i<n;i++)
{
scanf("%c %d",&data,&parentId);
newTree.Tnodep[i].data=data;
newTree.Tnodep[i].parent=parentId;
getchar();
}
return newTree;
}
//求最近公共祖先节点
char GetCommonGrand(char ch1 ,char ch2,PTree pt)
{
int i,j,k,s=0,t=0;
PTNode p,q;
//用来存放节点祖先的数组
char n1[maxsize];
char n2[maxsize];
for(i=0;i<pt.n;i++)
{
if(pt.Tnodep[i].data==ch1)
j=i;
if(pt.Tnodep[i].data==ch2)
k=i;
}
p=pt.Tnodep[j];
while(p.parent!=-1)
{
p=pt.Tnodep[p.parent];
n1[s++]=p.data;
}
n1[s]=p.data;
q=pt.Tnodep[k];
while(q.parent!=-1)
{
q=pt.Tnodep[q.parent];
n2[t++]=q.data;
}
n2[t]=p.data;
//寻找最近公共祖先
for(i=0;i<=s;i++)
{
for(j=0;j<=t;j++)
{
if(n1[i]==n2[j])
{
return n1[i];
}
}
}
}
int main(void)
{
char data;
char ch1,ch2;
PTree newTree = CreatePTree();
scanf("%c %c",&ch1,&ch2);
data = GetCommonGrand(ch1,ch2,newTree);
printf("%c和%c最近的共同祖先为:%c\n",ch1,ch2,data);
return 0;
}