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

原创 2015年07月06日 23:55:59

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

}

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

相关文章推荐

九度OJ-题目1509:树中两个结点的最低公共祖先

题目链接地址: 九度OJ-题目1509:树中两个结点的最低公共祖先 题目描述: 给定一棵树,同时给出树中的两个结点,求它们的最低公共祖先。 输入: 输入可能包含多个测试样...

二叉树中任意两节点的最低共同父节点

通过两个和二叉树相关的算法题来看看和递归在二叉树中的应用 输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。 思路: 如果这两个节点不在同一个子树下面,那么这棵树的根节点就是他们的共...

求二叉树中任意两结点的最近共同祖先的算法及其证明

一、问题描述   已知一个二叉树T,以及该二叉树中的某两个结点A和B。求:结点A和B的最近共同祖先。 二、算法描述 先序遍历二叉树T,得到其先序序列Seqpre。不失一般性地,设: S...

二叉树中找两个结点的最近公共祖先结点

一、搜索二叉树:第一变种是二叉树是一种特殊的二叉树:查找二叉树。也就是树是排序过的,位于左子树上的结点都比父结点小,而位于右子树的结点都比父结点大。我们只需要从根结点开始和两个结点进行比较。如果当前结...

求一颗不含指向父节点指针的普通树中任意两个结点的最近公共祖先(O(N*N) 和 O(N) 算法)

//方法1 来自剑指offer //#include //#include //#include //using namespace std; //#include "BinaryTree.h"...
  • ssopp24
  • ssopp24
  • 2017年06月29日 15:51
  • 569

查找二叉树某两个节点最近的共同祖先及改进方法

这个题目偶尔看到网上有个jie
  • J__King
  • J__King
  • 2014年09月09日 23:12
  • 1527

看数据结构写代码(26) 求二叉链表 任意 两个节点的 最近祖先

杂谈:在网上 看到 这个 题目,忍不住  自己 操作了 一把。 呵呵。兴趣 是 最好的 老师。 网上的 解决方案 五花八门,其中 比较 好 理解的 思路 就是 求出 两个节点 的 所有祖先。然后 比...

LCA问题:求二叉树中任意两个节点的最近公共祖先

问题描述:英语:Given an arbitrary binary tree, propose amethod to determine the first common ancestor of 2 ...

判断一棵树是否是完全二叉树和求二叉树中两个节点的最近公共祖先——题集(十三)

判断一棵树是否是完全二叉树和求二叉树中两个节点的最近公共祖先——题集(十三) 今天来分享一下,如何判断一棵树是否是完全二叉树和求二叉树中两个节点的最近公共祖先的代码实现和运行示例。 判断一棵树是否是完...

求二叉树中两个节点的最近公共祖先结点

二叉树是搜索二叉树 1、原理:二叉搜索树是排序过的 ,位于左子树的结点都比父结点小,位于右子树的结点都比父结点大,我们只需从根节点开始和两个输入的结点进行比较,如果当前节点的值比两个结点的值都大,那么...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计一个算法求节点值为x和节点y值得两个节点的最近共同祖先
举报原因:
原因补充:

(最多只允许输入30个字)