设计一个算法求节点值为x和节点y值得两个节点的最近共同祖先

思想:采用非递归后序遍历二叉树b.当找到节点值为x的节点时将栈中所有节点值存放在anorx数组中(如图所示的二叉树,F节点的anorx为“ACF”),当找到节点值为y的节点时将栈中所有节点值存放在anory数组中(对于如图所示的二叉树,E节点的anory为“ACE”),当两个节点均已找到后,通过比较找到他们最近的公共祖先(对于如图所示的二叉树,F和E节点的最近公共祖先为C),对应的算法如下:

设计一个算法求节点值为x和节点y值得两个节点的最近共同祖先_第1张图片











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;

}

你可能感兴趣的:(二叉树,公共祖先,非递归后序遍历)