码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-07-07 01:00:18      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:二叉树   非递归后序遍历   公共祖先   

思想:采用非递归后序遍历二叉树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;

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:二叉树   非递归后序遍历   公共祖先   

原文地址:http://blog.csdn.net/wuruiaoxue/article/details/46780481

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!