考试做到这一题,当时写的很乱,这让我很烦,题目就是在二叉树查找某个值的结点,如果找到则输出该节点的所有祖先,那我当时想到的就是用后序遍历的非递归算法,如果找到的话,栈中的所有元素就是该节点的祖先,不过后序遍历的话需要用一个标记记录栈顶元素,第一次访问栈顶的元素的时候不出栈,第二次访问栈顶元素的时候再出栈,今天我想起来,大概写了一下代码,可能不完全正确,但是能表达我的想法了,代码如下:
typedef struct{
Bitree p;//二叉树结点
bool first;
}*Stack;
void FindValue(Elemtype x,Bitree p){
Stack S;
S.push(p);//根结点压栈
S.top()->first=true;
p=p->lchild;
while(!S.empty())
{
while(p!=NULL)
{
S.push(p);
S.top()->first=true;
p=p->lchild;
}
if(S.top()->p->data=x)
{
while(!S.empty())
{
S.pop();
//栈里的元素就是结点的祖先,所有元素出栈
}
}
else if(S.top()->first!=true)
{
S.pop();
}
else if(S.top()->first==true)
{
S.top()->first=false;
p=S.pop()->right;
}
}
}
考试写的也差不多,希望老师能给个80%的分吧,嘿嘿