在二叉树中查找值为 x的结点,试编写算法(用 C语言)打印值为 X 的结点的所有祖先,假设值为x的结点不多于一个。

题目描述:在二叉树中查找值为 x的结点,试编写算法(用 C语言)打印值为 X 的结点的所有祖先,假设值为x的结点不多于一个。

分析: 两种思路,递归和非递归。

<1>递归算法

思路: 考虑递归,当前结点值不等于 x 时,递归其左右子树,如果两者有一个返回值为 true,则说明当前结点为 x 的祖先结点,直接打印。

c 复制代码
bool AncestorX(BiTree T,ElemType x){
	if(T == NULL)
		return false;
	if(T->data == x)
		return true;
	if(AncestorX(T->lchild,x) || AncestorX(T->rchild,x))
		printf(T->data);
}

<2>非递归算法

思路: 非递归,因为在遇到 x 的时候需要将其所有祖先打印,而当访问到 x 且能保留x 的祖先的方法,只有使用后序非递归遍历(后序非递归遍历形式)。

c 复制代码
void AncestorX2(BiTree T,ElemType x){
	InitStack(S);
	BiTNode *p = T;
	BiTNode *r = NULL;
	while(p || !IsEmpty(S)){
		if(p){
			push(S,p);
			p = p->lchild;
		}
		else{
			GetTop(S,p);
			if(p->data == x){
				pop(S,p);			//先把等于 x 的结点弹出
				while(!IsEmpty(S)){
					pop(S,p);
					printf(p->data);
				}
				return;
			}
			if(p->rchild && p->rchild != r)
				p = p->rchild;
			else{
				pop(S,p);
				r = p;					//记录右结点已访问
				p = NULL;				//防止再次把 p 结点压入栈
			}
		}
	}
}
相关推荐
CSharp精选营2 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
刘马想放假6 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠7 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦14 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠15 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾15 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82115 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q15 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒15 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
WL学习笔记15 天前
单项不带头不循环链表
数据结构·链表