【正确答案】本题采用非递归后序遍历树t,当后序遍历访问到s所指结点时,stack中所有结点均为p所指结点的祖先,由这些祖先便构成了一条从根结点到p所指结点之间的路径。
实现本题功能的程序代码如下:
int path(BTNode *t,BTNode *s)
{
BTNode *stack[MaxSize];
BTNode *p;
int i,flag,top=-1; //栈指针置初值
do
{
while(t) //将t的所有左结点入栈
{
++top;
stack[top]=t;
t=t→left;
}
p=NULL; //p指向当前结点的前一个已访问的结点
flag=1; //设置t的访问标记为已访问过
while(top!=1 && flag)
{
t=stack[top]; //取出当前的栈顶元素
if(t→right==p)
//右子树不存在或已被访问,访问之
{
if(t==s) //要访问的结点为要找的结点
{
for(i=0;i<=top;++i)
cout<<stack[i]→data<<" ";
return 1;
}
else
{
--top;
p=t; //p指向已被访问的结点
}
}
else
{
t=t→right; //t指向右子树
flag=0; //设置未被访问的标记
}
}
} while(top!=-1);
return 0;
}
【答案解析】