这里是我写的二叉树的创建、递归遍历与非递归遍历。
经过测试递归遍历可以完美运行、非递归遍历单次运行没有问题。、
但只要非递归遍历连续运行三次就会出现问题。(如果有大佬,可以帮忙解答一下)。
这里我输入的二叉树序列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;
}