树的非递归遍历(中序遍历栈实现)

树的非递归遍历(中序遍历栈实现)


#include<stdio.h>
#include<stdlib.h>
#define MAX 100

typedef struct BNode {
	char data;
	struct BNode* lchild, * rchild;
}*BiTree, BNode;
typedef BiTree ElemType;
typedef struct {
	ElemType data[MAX];
	int top;
}SqStack;
void InitStack(SqStack& S)
{
	S.top = -1;
}
int StackEmploy(SqStack &S) {
	if (S.top == -1) {
		return 1;
	}
	else {
		return 0;
	}
}
int Push(SqStack& S, BiTree e) {
	if (S.top == MAX - 1) {
		return 0;
	}	
		S.data[++S.top] = e;
		return 1;
	
}
int Pop(SqStack &S, BiTree &e) {
	if (S.top == -1) {
		return 0;
	}
	
		e=S.data[S.top--];
		return 1;
	
}
void Init(BiTree &T){
	T->data = '#';
	T->lchild = NULL;
	T->rchild = NULL;
}
BiTree Create(BiTree& T) {
	char c;
	scanf("%c", &c);
	if (c == '#') {
		T = NULL;
	}
	else {
		T = (BiTree)malloc(sizeof(BNode));
		T->data = c;
		T->lchild = Create(T->lchild);
		T->rchild = Create(T->rchild);
	}
	return T;
}
void  inittree(BiTree T)
{
	T->rchild = NULL;
	T->lchild = NULL;
}
void InTraver(BiTree T) {
	SqStack S;
	InitStack(S);
	BiTree p = T; BiTree q;
	while (p || !StackEmploy(S)) {
		
		if (p) {

			Push(S, p);
			p = p->lchild;
		
		}
		else {
			Pop(S,q);
			printf("%c", q->data);
			p = q->rchild;
		}
	}
}
void InOrder(BiTree& T) {

	if (T) {
	
		printf("%c", T->data);
		InOrder(T->lchild);

		InOrder(T->rchild);

	}
}
int main() {
	BiTree T = (BiTree)malloc(sizeof(BNode));
	Init(T);
	T = Create(T);
	//InOrder(T);
	InTraver(T);
	return 0;
}
#include<stdio.h>
#include<stdlib.h>
#define MAX 100

typedef struct BNode {
	char data;
	int flag;//标记是否已经访问完左右子树
	struct BNode* lchild, * rchild;
}*BiTree, BNode;
typedef BiTree ElemType;
typedef struct {
	ElemType data[MAX];
	int top;
	
}SqStack;
void InitStack(SqStack& S)
{
	S.top = -1;
}
int StackEmploy(SqStack& S) {
	if (S.top == -1) {
		return 1;
	}
	else {
		return 0;
	}
}
int Push(SqStack& S, BiTree e) {
	if (S.top == MAX - 1) {
		return 0;
	}
	S.data[++S.top] = e;
	return 1;

}
int Pop(SqStack& S, BiTree& e) {
	if (S.top == -1) {
		return 0;
	}

	e = S.data[S.top--];
	return 1;

}
void Init(BiTree& T) {
	T->data = '#';
	T->lchild = NULL;
	T->rchild = NULL;
}
BiTree Create(BiTree& T) {
	char c;
	scanf_s("%c", &c);
	if (c == '#') {
		T = NULL;
	}
	else {
		T = (BiTree)malloc(sizeof(BNode));
		T->data = c;
		T->lchild = Create(T->lchild);
		T->rchild = Create(T->rchild);
	}
	return T;
}
void  inittree(BiTree T)
{
	T->rchild = NULL;
	T->lchild = NULL;
}
void InTraver(BiTree T) {
	SqStack S;
	InitStack(S);
	BiTree p = T; BiTree q;
	while (p || !StackEmploy(S)) {

		if (p) {

			Push(S, p);
			p = p->lchild;

		}
		else {
			Pop(S, q);
			printf("%c", q->data);
			p = q->rchild;
		}
	}
}
void preTraver(BiTree T) {//前序遍历
	SqStack S;
	InitStack(S);
	BiTree p = T;
	//	printf("%c",T->data);
	BiTree q;
	while (p || !StackEmploy(S)) {
		if (p) {
			printf("%c", p->data);
			Push(S, p);
			p = p->lchild;
		}
		else {
			Pop(S, q);
			p = q->rchild;
		}
	}
}

void Traver(BiTree T) {//后序遍历
	SqStack S;
	InitStack(S);
	BiTree p = T;
	BiTree q;
	while (p || !StackEmploy(S)) {
		if (p) {
			p->flag = 1;
			Push(S, p);
			p = p->lchild;

		}
		else {
			
			Pop(S, q);
			if (q->flag == 1) {//标记为1说明只访问完了左子树
				q->flag= 2;
				Push(S, q);
				p = q->rchild;
	
			}
			else {
				
				printf("%c", q->data);
				p = NULL;
			}
			

		}
	}
}

void InOrder(BiTree& T) {

	if (T) {

		printf("%c", T->data);
		InOrder(T->lchild);

		InOrder(T->rchild);

	}
}
int main() {
	BiTree T = (BiTree)malloc(sizeof(BNode));
	Init(T);
	T = Create(T);
	InOrder(T);//递归中序
    InTraver(T);//非递归中序
	preTraver(T);//非递归前序
	Traver(T);// 非递归 /后序
	return 0;
}

输入的树是这个样子:
在这里插入图片描述
运行结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值