考研数据结构(每日一题)
题目:在二叉树中查找值为x的结点,编写算法打印值为x的结点的所有祖先,假设值为x的结点不多于一个。
算法思想:
采用非递归后序遍历,最后访问根结点,访问到值为x的结点时,栈中所有元素均为结点的祖先,依次出栈打印即可。
完整代码:
typedef struct{
BiTree t;
int tag;
}stack; //tag=0表示左子女被访问,tag=1表示右子女被访问
void Search(BiTree bt,ElemType x){
stack s[];
top = 0;
while(bt != NUll || top > 0){
while(bt != NULL && bt -> data != x){ //结点入栈
a[++ top].t = bt;
s[top].tag = 0;
bt = bt -> lchild; //沿左分支向下
}
if (bt != NULL && bt -> data == x){
printf("所查找结点的所有祖先结点的值为:\n"); //找到x
for (int i = 1; i <= top; i++){
printf("%d",s[i].t -> data); //输出祖先值后结束
exit(1);
}
}
while(top != 0){
top --; //退栈(空遍历)
}
if(top != 0){
s[top].tag == 1;
bt = s[top].t -> rchild; //沿右分支向下遍历
}
}
}