关闭

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

标签: 二叉树非递归后序遍历公共祖先
1088人阅读 评论(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;

}

1
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:128669次
    • 积分:2262
    • 等级:
    • 排名:第16536名
    • 原创:67篇
    • 转载:123篇
    • 译文:3篇
    • 评论:36条
    最新评论