二叉树的遍历

这里是我写的二叉树的创建、递归遍历与非递归遍历。
经过测试递归遍历可以完美运行、非递归遍历单次运行没有问题。、
但只要非递归遍历连续运行三次就会出现问题。(如果有大佬,可以帮忙解答一下)。
这里我输入的二叉树序列ABD##E##C#G##,以下是我的结果。(第三次结果错误,仅测试非递归先序遍历,其他博友可自行测试)
在这里插入图片描述

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

//二叉树的操作
typedef char TElemType;
typedef struct BiTNode {
	TElemType data1;
	struct BiTNode *lchild , *rchild;
} BiTNode,*BiTree;

//栈的一系列操作
typedef BiTNode SElemType;

typedef struct StackNode {
	BiTNode *data2;
	struct StackNode *next;
} StackNode,*LinkStack;

//链栈初始化
void InitStack(LinkStack &S) {
	S=NULL;
//	printf("\n 链栈初始化完成!");
}

//入栈
void Push(LinkStack &S,SElemType *e) {
	StackNode *p;
	p=(StackNode *)malloc(sizeof(LinkStack));
	p->data2=e;
	p->next=S;
	S=p;
//	printf("\n 链栈入栈完成!");
}

//出栈
BiTree Pop(LinkStack &S) {
	if(!S)	{
		printf("\n 链栈为空!");
		exit(0);
	}
	StackNode *p;
	BiTNode *r;
	r=S->data2;
	p=S;
	S=S->next;
	free(p);
//	printf("r=");
//	printf("%d\n",r);
//	printf("\n 链栈出栈完成!");
	return r;
}

//获得栈顶元素 
BiTree GetTop(LinkStack S) {
	if(S)	return S->data2;
}

//判断栈是否为空
int StackEmpty(LinkStack S) {
	if(S)	return 0;
	else {
//		printf("\n 链栈为空!");
		return 1;
	}
}





void CreateBiTree(BiTree &T) {
	char ch;
	scanf("%c",&ch);
	if(ch=='#')	T=NULL;		//改成int 不可以了
	else {
		T=(BiTNode * ) malloc (sizeof(BiTree));
		T->data1=ch;
		CreateBiTree(T->lchild);
		CreateBiTree(T->rchild);
	}
}

//递归遍历	先序 
void ReTraverseFirst(BiTree T) {
	if(T) {
		printf("%c ",T->data1);
		ReTraverseFirst(T->lchild);
		ReTraverseFirst(T->rchild);
	}
}

//递归遍历	中序 
void ReTraverseMiddle(BiTree T) {
	if(T) {
		ReTraverseMiddle(T->lchild);
		printf("%c ",T->data1);
		ReTraverseMiddle(T->rchild);
	}
}
//递归遍历	后序 
void ReTraverseLast(BiTree T) {
	if(T) {
		ReTraverseLast(T->lchild);
		ReTraverseLast(T->rchild);
		printf("%c ",T->data1);
	}
}

//非递归操作 此为测试部分 
void InOrderTraverseTest(BiTree T) {
	LinkStack S;
	InitStack(S);
	BiTNode *p;
	BiTNode *q;
	p=T;
	q=(BiTNode *) malloc (sizeof(BiTNode));
//	printf("\n ~~~~~~~~~~ %d",(p || !StackEmpty(S)));
//	printf("\n 外边的p~~~~~~~~~~ %d",p);
//	q=Pop(S);
	while( p || !StackEmpty(S)) {
		while (p) {
			Push(S,p);
			p=p->lchild;
		}
		//当p为空时,说明已经到达左子树最下边,这时需要出栈了
		if (!StackEmpty(S)) {
			p = Pop(S);
			printf("%c ",p->data1);
		//进入右子树,开始新的一轮左子树遍历(这是递归的自我实现)
			p = p->rchild;
//			break;
		}
//		printf("\n 循环中的p~~~~~~~~~~ %d",p);
//		if(p) {
//			Push(S,p);
			printf("%c",p->data1);
			printf("\n");
//			p=p->lchild;
//		} else {
//					q=Pop(S);
//					printf("二叉树遍历:%c ",q->data1);
//					p=q->rchild;
//		}
//	}
	}
}

//非递归操作 先序遍历 
void InOrderTraverseFirst(BiTree T) {
	LinkStack S;
	InitStack(S);
	BiTNode *p;
//	p=(BiTNode *) malloc (sizeof(BiTNode));
	p=T;
//	printf("%d",p);
	while( p || !StackEmpty(S)) {
		if(p) {
			printf("%c ",p->data1);
			Push(S,p);
			p=p->lchild;
		} else {
					p=Pop(S);
					p=p->rchild;
		}
	}
}

//非递归操作 中序遍历 
void InOrderTraverseMiddle(BiTree T) {
	LinkStack S;
	InitStack(S);
	BiTNode *p;
	p=T;
//	q=(BiTNode *) malloc (sizeof(BiTNode));
	while( p || !StackEmpty(S)) {
		if(p) {
			Push(S,p);
			p=p->lchild;
		} else {
					p=Pop(S);
					printf("%c ",p->data1);
					p=p->rchild;
		}
	}
}

//非递归操作 后序遍历 
void InOrderTraverseLast2(BiTree T) {
	LinkStack S;
	InitStack(S);
	BiTNode *p;
	BiTNode *q;
	p=T;
//	q=(BiTNode *) malloc (sizeof(BiTNode));
	while( p || !StackEmpty(S)) {
		if(p) {
			Push(S,p);
			p=p->lchild;
		} else {
					q=Pop(S);
					p=q->rchild;
					printf("%c ",q->data1);
		}
	}
}

void InOrderTraverseLast(BiTree T) {
	LinkStack S;
	InitStack(S);
	BiTNode *p;
	BiTNode *r;
//	p=(BiTNode *) malloc (sizeof(BiTNode));
	p=T;
	r=NULL;
	while( p || !StackEmpty(S)) {
		if(p) {
			Push(S,p);
			p=p->lchild;
		} else {
					p=GetTop(S);
					if(p->rchild && p->rchild!=r){
						p=p->rchild;
					}else{
						p=Pop(S);
						printf("%c ",p->data1);
						r=p;
						p=NULL;
					} 
		}
	}
}
int main() {
	BiTree T;
	printf("请输入先序序列的结点值:");//ABD##E##C#G##
	CreateBiTree(T);
	printf("\n 递归先序遍历结果为:");
	ReTraverseFirst(T);					//递归遍历
	printf("\n 递归中序遍历结果为:");
	ReTraverseMiddle(T);				//递归遍历
	printf("\n 递归后序遍历结果为:");
	ReTraverseLast(T);					//递归遍历
	
	printf("\n 非递归先序遍历结果为:");
	InOrderTraverseFirst(T);			//非递归遍历
	printf("\n 非递归先序遍历结果为:");
	InOrderTraverseFirst(T);			//非递归遍历
	printf("\n 非递归先序遍历结果为:");
	InOrderTraverseFirst(T);			//非递归遍历
	printf("\n 非递归中序遍历结果为:");
	InOrderTraverseMiddle(T);			//非递归遍历
	printf("\n 非递归后序遍历结果为:");
	InOrderTraverseLast(T);				//非递归遍历(这个遍历时前面2个不能运行)
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值