
/*
在二叉树中查找值为x的节点,试编写算法打印值为x的节点的所有祖先,假设x的值不多于一个。
分析:
这里我们采用后序遍历(非递归),因为在我们遇到x之前我们会把它的祖先节点全部入栈,当我们找到x时,再依次取出栈中元素
*/
struct biTree {
char data;
struct biTree *lchild;
struct biTree *rchild;
};
struct Stack {
biTree *arr;
int len;
int top;
};
#include <stdio.h>
#include <stdlib.h>
void findAllAncestor(biTree *T, Stack *s, char x) {
struct biTree *p = T;
struct biTree *r = (struct biTree *)malloc(sizeof(struct biTree));
struct biTree *tp = (struct biTree *)malloc(sizeof(struct biTree));
bool push(Stack *, biTree*);
bool pop(Stack *);
biTree *top(Stack *);//返回得是一个指针
bool empty(Stack *);
while (p || !empty(s)) {
if (p) {//一路将所有左孩子入栈
push(s, p);
p = p->lchild;
}
else {//没有左孩子,
p = top(s);
if (p->rchild && p != r) {//将右子树的所有左孩子入栈
r = p;
p = p->rchild;
}
else {//当既没有左孩子也没有右孩子时,该出栈了
pop(s);//被查找元素先出栈
if (p->data == x) {//找到了,那么如果栈中有元素,那全都是它的祖先
printf("祖先元素有:");
while (!empty(s)) {
tp = top(s);
printf("%c ", tp->data);
pop(s);
}
}
p = NULL;//一定要将p置空,不然又会把p的左孩子入栈
}
}
}
}
int main() {
int count = 0, x;
struct biTree *T = (struct biTree *)malloc(sizeof(struct biTree));
struct Stack *s;
biTree *create(biTree *);
void nodeNum(biTree *, int *);
Stack *createStack(int);
T = create(T);
nodeNum(T, &count);
s = createStack(count);
printf("请输入要查找的元素:x=");
x = getchar();
findAllAncestor(T, s, x);
return 0;
}