思想:采用非递归后序遍历二叉树b.当找到节点值为x的节点时将栈中所有节点值存放在anorx数组中(如图所示的二叉树,F节点的anorx为“ACF”),当找到节点值为y的节点时将栈中所有节点值存放在anory数组中(对于如图所示的二叉树,E节点的anory为“ACE”),当两个节点均已找到后,通过比较找到他们最近的公共祖先(对于如图所示的二叉树,F和E节点的最近公共祖先为C),对应的算法如下:
int commancestor(BTNode *b,ElementType x,ElementType y)
{
ElementType anorx[MaxSize],anory[MaxSize];
BTNode *St[MaxSize];//定义一个顺序栈
BTNode *p=b,*q;
int flag,top=-1,i;//栈指针置初值
bool findx=false,findy=false;
if(b!=NULL)
{
do
{
while(p!=NULL)//将*p所有左节点进栈
{
top++;
St[top]=p;
p=p->lchild;
}
q=NULL;//q指向栈顶节点的前一个已访问的节点
flag=1;//设置flag=1表示处理栈顶节点
while(top!=-1&&flag==1)
{
p=St[top];//取当前的栈顶元素
if(p->rchild==q)//右孩子不存在或右孩子已被访问,访问之
{
if(p->data==x)//要访问的节点为要找的节点
{
for(i=0;i<top;i++)//将路径存入anorx中
{
anorx[i]=St[i]->data;
}
findx=true;
}
else if(p->data==y)//将路径存入anory中
{
for(i=0;i<=top;i++)
{
anory[i]=St[i]->data;
}
findy=true;
}
if(findx&&findy)//x和y均已找到
{
i=0;
while(anorx[i]==anory[i])
i++;
printf("最近公共祖先:%c\n",anorx[i-1]);
return 1;
}
top--;
q=p;//q指向刚被访问的节点
}
else
{
p=p->rchild;//p指向右孩子节点
flag=0;//设置flag=0表示栈顶节点处理完毕
}
}
}while(top!=-1);//栈不空循环
printf("\n");
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。