wuruiaoxue的专栏

不断学习,勇攀技术高峰

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

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

}

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wuruiaoxue/article/details/46780481
个人分类: 数据结构笔记
上一篇电脑无故失去焦点,罪魁祸首是谁?终极解决办法
下一篇设计一个算法,判断一个二叉树是否为完全二叉树
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭