在二叉树中查找值为 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 结点压入栈
			}
		}
	}
}
相关推荐
计算机安禾2 分钟前
【数据结构与算法】第44篇:堆(Heap)的实现
c语言·开发语言·数据结构·c++·算法·排序算法·图论
汀、人工智能15 分钟前
[特殊字符] 第91课:课程表
数据结构·算法·数据库架构·图论·bfs·课程表
测绘第一深情2 小时前
MapQR:自动驾驶在线矢量化高精地图构建的端到端 SOTA 方法
数据结构·人工智能·python·神经网络·算法·机器学习·自动驾驶
想带你从多云到转晴2 小时前
04、数据结构与算法---双向链表
java·数据结构·算法·链表
橘颂TA2 小时前
【笔试】算法的暴力美学——牛客 BC140:杨辉三角
数据结构·牛客
Lsk_Smion2 小时前
Hot100(开刷) 之 长度最小的数组--删除倒数第N个链表--层序遍历
java·数据结构·算法·kotlin
郝学胜-神的一滴3 小时前
从链表到二叉树:树形结构的入门与核心性质解析
数据结构·c++·python·算法·链表
北顾笙9804 小时前
day23-数据结构力扣
数据结构·算法·leetcode
阿Y加油吧5 小时前
栈的经典应用:字符串解码 & 每日温度 深度解析
数据结构·python·算法
千谦阙听5 小时前
数据结构最终章:万字详解排序算法!(内部排序)
c语言·数据结构·学习·算法·排序算法