数据结构树习题(一)

 

设一棵二叉树的结点结构为(LLINK,INFO,RLINK),ROOT为指向该二叉树根结点的指针,p和q分别为指向该二叉树中任意两个结点的指针,试编写一个算法ANCESTOR(ROOT,p,q,r),该算法找到p和q的最近共同祖先结点r

分析:本题要找p和q的最近共同祖先结点r,不失一般性,设p在q的左边。采用后续非递归算法,栈中存放二叉树结点的指针,当访问到某结点时,栈中所有元素均为该结点的祖先。后序遍历必然先遍历到结点p,栈中元素均为p的祖先。先将栈复制到另一辅助栈中,再继续遍历到结点q时,将栈中元素从栈顶开始逐个到辅助栈中去匹配,第一个匹配(相等)的元素就是结点p和q的最近公共祖先。

代码如下:

 

typedef struct
{
	BiTree t;
	int tag;
}stack;
stack s[],s1[];
BiTree Ancestor(BiTree ROOT,p,q)
{
	top=0;bt=ROOT;
	while(bt!=NULL||top>0)
	{
		while(bt!=NULL&&bt!=p&&bt!=q)
		{
			while(bt!=NULL)
			{
				s[++top].t=bt;
				s[top].tag=0;
				bt=bt->lchild;
			}
			while(top!=0&&s[top].tag==1)
			{
				if(s[top].t==p)
				{
					for(i=1;i<=top;i++)
					{
						s1[i]=s[i];
					}
					top1=top;
				}
				if(s[top].t==q)
				{
					for(i=top;i>0;i--)
					{
						for(j=top1;j>0;j--)
						{
							if(s1[j].t==s[i].t)
							{
								return (s[i].t);
							}
						}
					}
					top--
				}
			}
			if(top!=0)
			{
				s[top].tag=1;
				bt=s[top].t->rchild;
			}
		}
	}
	return NULL;
}


 

你可能感兴趣的:(程序人生)