非递归实现树的遍历

简介:

【代码】

#include <iostream>
#include <stack>
using namespace std;

typedef struct Node{
	char key;
	struct Node *lchild, *rchild;
}*Tree, TNode;

void PreOrder(Tree T) //先序遍历
{
	if (T == NULL)
		return;
	TNode *curr = T;
	//TNode *tmp;
	stack<Tree> s;
	while (curr != NULL || !s.empty()) {
		if (curr != NULL) {
			cout<<curr->key;
			s.push(curr);
			curr = curr->lchild;
		}
		else {
			curr = s.top();
			s.pop();
			curr = curr->rchild;
		}
	}
	/*
	while (curr != NULL) {
		cout<<curr->key;
		s.push(curr);
		curr = curr->lchild;
	}
	while(!s.empty()) {
		curr = s.top();
		s.pop();
		tmp = curr->rchild;
		while(tmp != NULL) {
			cout<<tmp->key;
			s.push(tmp);
			tmp = tmp->lchild;
		}
	}
	*/
}

void InOrder(Tree T)  //中序遍历
{
	if (T == NULL)
		return;
	TNode *curr = T;
	//TNode *tmp;
	stack<Tree> s;
	while ((curr != NULL) || !s.empty()) {
		if (curr != NULL) {
			s.push(curr);
			curr = curr->lchild;
		}
		else {
			curr = s.top();
			cout<<curr->key;
			s.pop();
			curr = curr->rchild;
		}
	}

}

void PostOrder(Tree T) //后序遍历
{
	if (T == NULL)
		return ;
	TNode *curr = T, *pre = NULL;
	stack<Tree> s;
	while (curr != NULL || !s.empty()) {
		if (curr != NULL) {
			s.push(curr);
			curr = curr->lchild;
		}
		else {
			curr = s.top();
			s.pop();
			if (curr->rchild != NULL && curr->rchild != pre) {
				s.push(curr);
				curr = curr->rchild;
			}
			else {
				cout<<curr->key;
				pre = curr;
				curr = NULL;
			}
		}
	}
}

Tree createTree(char *s, int n, int i) //建树
{
	if (i >= n)
		return NULL;
	TNode *curr;
	curr = (TNode *)malloc(sizeof(TNode));
	curr->key = s[i];
	
	curr->lchild = createTree(s, n, 2*(i+1)-1);
	curr->rchild = createTree(s, n, 2*(i+1));
	return curr;
}

void freeTree(Tree T)  //释放
{
	if (T != NULL){
		freeTree(T->lchild);
		freeTree(T->rchild);
		delete T;
	}
}

int main(void)
{
	char s[] = "ABCDEFG";
	Tree T;
	T = createTree(s, 7, 0);
	InOrder(T);
	cout<<endl;
	PreOrder(T);
	cout<<endl;
	PostOrder(T);
	cout<<endl;
	freeTree(T);
	return 0;
}







本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5169524.html,如需转载请自行联系原作者

相关文章
|
存储 Kubernetes 调度
【K8S系列】第二讲:Pod入门
【K8S系列】第二讲:Pod入门
288 0
|
人工智能 小程序 数据可视化
低代码平台功能对比:哪个平台最高效
数字化转型背景下,低代码平台成为企业提升开发效率的优选。低代码开发允许通过少量代码甚至无代码创建应用,简化开发过程,降低门槛。本文介绍低代码概念及优势,并推荐Zoho Creator、织信、Mendix、微搭、轻流等平台,建议企业根据功能、易用性、集成能力等因素选择合适的平台。低代码平台能显著缩短开发周期,降低成本,提升业务敏捷性,增强员工参与度,并具备良好的可维护性。
550 61
|
运维 Cloud Native 持续交付
云端新纪元:云原生技术的崛起与影响
在当今数字化转型的浪潮中,云原生技术以其独特的优势和广泛的应用前景,正迅速成为业界关注的焦点。本文将深入探讨云原生技术的核心概念、关键技术、应用案例以及面临的挑战和发展趋势,揭示其在云计算领域的独特魅力和未来发展潜力。
227 27
|
JSON 安全 API
淘宝 API 接口:解锁商品详情的强大工具
淘宝API接口在电商领域扮演着关键角色,为商家和开发者提供强大的数据支持和服务能力。它不仅帮助商家获取商品信息、管理订单和物流,还支持数据分析、价格调整等功能,助力商家在竞争激烈的市场中取得成功。此外,通过注册认证、搭建开发环境等步骤,开发者可快速上手并利用丰富的技术文档和社区支持进行高效开发。
|
存储 安全 Java
学习Java的高级特性
学习Java的高级特性是成为一名优秀的Java开发者的必备知识。在本文中,我们将深入探讨泛型、注解、反射和Lambda表达式这些高级特性,并提供相应的Java代码示例。
|
人工智能 安全 专有云
阿里云飞天企业版获信通院可信云技术最佳实践奖
在中国信息通信研究院举办的“2024可信云大会”上,阿里云飞天企业版凭借“一云多算”能力拿下“可信云技术最佳实践”奖。此外飞天企业版还通过了《“云+应用”一体化运维能力要求》、《行业云平台一体化运营平台评估L4卓越级》等多项评估。
400 1
农场养成种树种植游戏系统开发案例详细丨dapp农场养成种植种树游戏系统开发规则玩法/设计案例/功能逻辑/源码部署
  农场养成种树游戏(Farm simulation tree planting game)是一类模拟农场生活的游戏。在这种游戏中,玩家扮演农场主或农民的角色,通过种植和护理树木,以及进行相关的农业活动,来管理和发展自己的农场。
|
关系型数据库 分布式数据库 数据库
阿里云618创新加速季数据库分会场全攻略
2024年阿里云618创新加速季活动已开启,数据库分会场推出多重优惠。RDS MySQL低至1折,部分产品享超值首购优惠,三个月仅需1折,续费也有折扣。此外,每天10点还有限时秒杀活动,云产品低至6.5折。新用户在新人专区购买指定规格可享首年折扣,还有数据库上云组合购优惠和开发者动手实践奖励。企业用户可申请5亿算力补贴,加速数字化转型。更多活动详情和优惠信息,可访问官方活动页面了解。
|
存储 监控 安全
DeeTune:基于 eBPF 的百度网络框架设计与应用
随着云计算的技术的不断迭代演进,百度内部服务逐渐搬迁到云环境中,部署成本和效率取得明显收益,但一些可观测能力的短板和缺失逐渐显露,传统的方式往往通过植入代码进行修改来实现,但在业务形态和技术栈多样性的背景下,面临业务被侵入、沟通协调、性能、稳定性等方面的诸多问题。本文中我们介绍百度基于 eBPF 实现的网络框架:DeeTune,包含构建服务拓扑、流量录制、无侵入指标监控等能力,进一步提升了 SRE 和质量保障的工作效率。
221 0