查找某节点的所有祖先☆

题目:在二叉树中查找值为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 pushS(Stack *, biTree*);
	bool pop(Stack *);
	biTree *top(Stack *);//返回得是一个指针
	bool empty(Stack *);
	while (p || !empty(s)) {
		if (p) {//一路将所有左孩子入栈
			pushS(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) {//找到了,那么如果栈中有元素,那全都是它的祖先
					while (!empty(s)) {
						printf("祖先元素有:");
						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;
}

  不要活在过去的阴影里,把每一天当作人生的新一天,生活才会多彩多姿。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北街学长

你的鼓励使我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值