试编写算法(用C语言)打印值为x的结点的所有祖先,假设值为x的结点不多于一个。(递归实现和非递归实现)

news2024/11/25 4:24:56

(一)递归实现:

完整代码: 

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;

#define MaxSize 100
typedef int ElemType;
typedef struct BiNode {
	ElemType data;
	BiNode* lchild;
	BiNode* rchild;

}BiNode, * BiTree;

//构建二叉树
BiNode* Create(BiNode* bt) {
	static int i = 0;
	char ch;
	//string str = "AB#D##C##";
	//string str = "124##56##7##3##";
	//string str = "ABD#G##E##CF###";
	string str = "ABD#GH##I##E##CF###";
	ch = str[i++];
	if (ch == '#')bt = NULL;//建立一棵空树 
	else {
		bt = (BiTree)malloc(sizeof(BiNode)); bt->data = ch;//生成一个结点,数据域为ch
		bt->lchild = Create(bt->lchild);//递归建立左子树
		bt->rchild = Create(bt->rchild);//递归建立右子树
	}
	return bt;
}

typedef struct {
	ElemType data[MaxSize];//存放栈中元素
	int top;//栈顶指针
}SqStack;

//(1)初始化
void InitStack(SqStack& S) {
	S.top = -1;//初始化栈顶指针
}
//(2)判栈空
bool IsEmpty(SqStack& S) {
	if (S.top == -1) {//栈空
		return true;
	}
	else {//不空
		return false;
	}
}
//(3)进栈
bool Push(SqStack& S, ElemType data) {
	if (S.top == MaxSize - 1) {//栈满,报错
		return false;
	}
	S.data[++S.top] = data;//指针先加1,再加入栈
	return true;
}
//(4)出栈
bool Pop(SqStack& S, ElemType &data) {
	if (S.top == -1) {//栈空,报错
		return false;
	}
	data = S.data[S.top--];//先出栈,指针再减1
	return true;
}
//(5)读栈顶元素
bool GetTop(SqStack& S, ElemType data) {
	if (S.top == -1) {//栈空,报错
		return false;
	}
	data = S.data[S.top];//先出栈,指针再减1
	return true;
}

bool Ancestors(BiNode* root,ElemType x, SqStack &S) {
	if (!root) return false;
	if (root->data == x) return true;
	if (Ancestors(root->lchild, x,S) || Ancestors(root->rchild, x, S)) {
		//printf("%c ", root->data);//G D B A
		Push(S, root->data);
		return true;
	}
	return false;
}

int main() {
	//创建一棵二叉树
	BiTree T = (BiTree)malloc(sizeof(BiNode));//创建一颗二叉树
	T = Create(T);
	SqStack S;
	InitStack(S);
	Ancestors(T, 'I',S);
	ElemType ch;
	while (!IsEmpty(S)) {
		Pop(S, ch);
		printf("%c ", ch); // A B D G
	}
}

 

 (二)非递归实现:

因为查找的过程就是后序遍历的过程,因此使用的栈的深度不超过树的深度

完整的代码:

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;

#define MaxSize 100
typedef char ElemType;
typedef struct BiNode {
	ElemType data;
	BiNode* lchild;
	BiNode* rchild;

}BiNode, * BiTree;

//构建二叉树
BiNode* Create(BiNode* bt) {
	static int i = 0;
	char ch;
	//string str = "AB#D##C##";
	//string str = "124##56##7##3##";
	//string str = "ABD#G##E##CF###";
	string str = "ABD#GH##I##E##CF###";
	ch = str[i++];
	if (ch == '#')bt = NULL;//建立一棵空树 
	else {
		bt = (BiTree)malloc(sizeof(BiNode)); bt->data = ch;//生成一个结点,数据域为ch
		bt->lchild = Create(bt->lchild);//递归建立左子树
		bt->rchild = Create(bt->rchild);//递归建立右子树
	}
	return bt;
}



//算法思想:采用非递归后序遍历,最后访问根结点,访问到值为x的结点时,栈
//中所有元素均为该结点的祖先,依次出栈打印即可。算法实现如下:
typedef struct {
	BiTree t;
	int tag;
}stack;//tag = 0 表示左子女被访问,tag = 1表示右子女被访问
bool Search(BiTree bt,ElemType x) {
	//在二叉树bt中,查找值为x的结点,并打印其所有祖先
	stack s[MaxSize];
	int top = 0;
	while (bt != NULL || top > 0) {
		while (bt != NULL && bt->data != x) {//结点入栈
			s[++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("%c ",s[i].t->data);//输出祖先值后结束
			}
			exit(1);
		}
		while (top != 0 && s[top].tag == 1)
			top--;//退栈(空遍历)

		if (top != 0) {
			s[top].tag = 1;
			bt = s[top].t->rchild;//沿右分支向下遍历
		}
		
	}
}

int main() {
	//创建一棵二叉树
	BiTree bt = (BiTree)malloc(sizeof(BiNode));//创建一颗二叉树
	bt = Create(bt);
	Search(bt, 'I');
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/53165.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于springboot摄影跟拍预定管理系统设计与实现的源码+文档

摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计。…

最新版k8s 1.25版本安装

简介 Kubernetes&#xff08;k8s&#xff09;是自动化容器操作的开源平台。这些容器操作包括&#xff1a;部署、调度和节点集群间扩展。 具体功能&#xff1a; 自动化容器部署和复制。实时弹性收缩容器规模。容器编排成组&#xff0c;并提供容器间的负载均衡。 总而言之&…

PHP基于thinkphp的教材管理系统#毕业设计

教材是每个学生和学校都必须具备的教学资源之一,它是知识的载体,是学生汲取知识的土壤,好的教材可以做到事半功倍的效果。但是通常情况下教材都是批量进行购买和发放的,为了能够更好的对教材信息进行管理,我们通过PHP语言,thinkphp框架开发了本次的教材管理系统 教材管理系统,…

谷粒学苑_第十一天

要开始做前台部分(用户环境) 之前我们用的后台前端框架是vue-admin-template 这次的前台框架是用的NUXT 轮播图实现 显示课程和老师 redis缓存 NUXT 服务端渲染技术 解压guli_site 在这里我们使用的是成品,页面也基本写好 然后下载依赖: 开始运行: npm rum dev后面…

[附源码]Python计算机毕业设计Django高校车辆管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

力扣(LeetCode)123. 买卖股票的最佳时机 III(C++)

前后缀分解 维护前缀和数组&#xff0c;保存 111~iii 天&#xff0c;买卖一次的最大利润。维护后缀和数组&#xff0c;保存 iii~nnn 天买卖一次的最大利润。枚举所有分界点 iii &#xff0c;买卖两次的最大利润 iii 的前缀和 i\ i i 的后缀和 111~iii 天买卖一次的最大利润 i\…

Mock测试

1、什么是mock测试 Mock 测试就是在测试活动中&#xff0c;对于某些不容易构造或者不容易获取的数据/场景&#xff0c;用一个Mock对象来创建以便测试的测试方法。 2、Mock测试常见场景 &#xff08;1&#xff09;无法控制第三方系统接口的返回&#xff0c;返回的数据不满足要…

Tomcat的安装、在idea中的使用以及创建Web项目

目录Tomcat的安装Tomcat运行Tomcat在idea中的使用创建Web项目最后Tomcat的安装 Tomcat的官网: https://tomcat.apache.org/ 从官网上可以下载对应的版本进行使用。 下载windows64位&#xff0c;版本自行选择。 下载好之后找到压缩包进行解压&#xff0c;注意目录不要有中文且…

MFC文件操作

MFC提供了一个文件操作的基类CFile&#xff0c;这个类提供了一个没有缓存的二进制格式的磁盘输入输出功能。通过他的派生类可以间接的支持文本、文件、内存文件等。 打开文件 通过对CFile类的初始化&#xff0c;即可完成文件的打开 CFile类的其中一个构造函数&#xff1a; …

【论文精读】A Survey on Deep Learning for Named Entity Recognition

A Survey on Deep Learning for Named Entity Recognition前言Abstract1. INTRODUCTION2. BACKGROUND2.1 What is NER?2.2 NER Resources: Datasets and Tools2.3 NER Evaluation Metrics2.3.1 Exact-Match Evaluation2.3.2 Relaxed-Match Evaluation2.4 Traditional Approach…

Docker学习教程

学前准备 &#x1f47f; Linux 基础 &#x1f47f; SpringBoot 基础 文章目录[toc]1. Docker 概述1.1 docker 为什么出现1.2 Docker 容器和虚拟机的不同1.3 Docker 能做什么2. Docker 安装2.1 Docker 的组成3. Docker 命令3-1 安装Nginx3-2 安装mysql3-3 安装java &#xff0c…

八、【React拓展】错误边界

理解 错误边界(Error boundary)&#xff1a;用来捕获后代组件错误&#xff0c;渲染出备用页面 如果你的组件内写了包含子组件&#xff0c;一个子组件内部发生了错误就会导致整个页面挂掉&#xff08;报错&#xff09;&#xff0c;限制这种错误影响其他组件&#xff08;就是限制…

10-18-hive-元数据及其他方式与hive交互

10-hive-元数据及其他方式访问hive&#xff1a; 使用元数据服务的方式访问 Hive (类似将hive提供了一个服务端) 1&#xff09;在hive-site.xml 文件中添加如下配置信息 <!-- 指定存储元数据要连接的地址 --> <property> <name>hive.metastore.uris</nam…

简易的shell实现

这篇文章的内容主要是利用进程的创建&#xff0c;等待&#xff0c;终止&#xff0c;替换。这些知识来实现一个自己的简易shell。 文章目录1. 大致思路2. 基本实现3. 额外拓展3.1 让文件带上颜色3.2 内建命令3.3 添加环境变量1. 大致思路 我们用了这么长的shell&#xff0c;它…

DolphinDB 四大因子库合集

目前市场上常见两种类型的因子库&#xff1a;技术分析类和基本面类。 常用的技术分析因子库包括 TA-Lib、WorldQuant 的101 alpha、通达信的 mytt、国泰君安的191等。 基本面因子方面&#xff0c;美联储高级经济学家 Andrew Chen 及科隆大学教授 Tom Zimmermann 详细整理总结…

Hadoop原理与技术——Linus命令行基本操作

一、实验目的 Hadoop运行在Linux系统上&#xff0c;因此&#xff0c;需要学习实践一些常用的Linux命令。本实验旨在熟悉常用的Linux操作&#xff0c;为顺利开展后续其他实验奠定基础。 二、实验环境 Windows 10 VMware Workstation Pro虚拟机 Hadoop环境 Jdk1.8 三、实验内…

IP-Guard如何判断Windows客户端是否安装成功?

1.在电脑本地打开services.msc 服务页面&#xff0c;找有没有windows helper service服务&#xff0c;该服务的可执行文件的路径中的进程是winrdgv3.exe是客户端进程。 2.cmd输入netstat -an|find "823",从输出的内容上判断是否连接上服务器连&#xff1b; 客户端开放…

Linux基础知识与实操-篇八:定期任务执行与进程任务处理

文章目录例行工作安排单一工作安排循环执行的任务注意事项唤醒停机期间的任务进程任务处理任务管理job control后台执行进程管理进程的执行顺序系统资源查看特殊文件与进程最后例行工作安排 类似于定时任务、系统安排的任务提醒等 一般在任务中&#xff0c;有两个类型&#x…

MR小区搜索(六)cell reselection

微信同步更新欢迎关注同名modem协议笔记 小区选择和小区重选都是idle态行为&#xff0c;小区重选无非是为了让UE驻留在信号状况最好的小区上&#xff0c;以便之后在connected mode获得更好的体验&#xff0c;小区重选的目标小区也要满足S准则&#xff0c;下面就来具体看下小区…

19c pdb克隆单机到rac,日志出现:WARNING报警处理

打开pdb后&#xff0c;警告日志出现 Violations: Type: 2, Count: 1 *************************************************************** WARNING: Pluggable Database PDB3 with pdb id - 3 is altered with errors or warnings. Please look into PDB_PLUG_IN_VIOLATIONS vie…