#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//栈的存储结构
typedef struct bnode
{
char data;
struct bnode *left,*right;
}Bnode,*BTree;
typedef struct node
{
BTree data;
struct node *next;
}StackNode,*PStackNode;
typedef struct
{
PStackNode top;
}LinkStack,*PLinkStack;
PLinkStack Init_LinkStack()
{
PLinkStack S;
S=(PLinkStack )malloc(sizeof(LinkStack));
if(S)
S->top=NULL;
return S;
}
int Empty_LinkStack(PLinkStack S)
{
return (S->top==NULL);
}
int Push_LinkStack(PLinkStack S,BTree x)
{
PStackNode p;
p=(PStackNode )malloc(sizeof(StackNode));
if(!p)
{
printf("内存溢出!\n");
return 0;
}
p->data=x;
p->next=S->top;
S->top=p;
return 1;
}
int Pop_LinkStack(PLinkStack S,BTree *x)
{
PStackNode p;
if(Empty_LinkStack(S))
{
printf("栈空,不能出栈!\n");
return 0;
}
*x=S->top->data;
p=S->top;
S->top=S->top->next;
free(p);
return 1;
}
int GetTop_LinkStack(PLinkStack S,BTree *x)
{
if(Empty_LinkStack(S))
{
printf("栈空!\n");
return 0;
}
*x=S->top->data;
return 1;
}
void Destroy_LinkStack(PLinkStack *LS)
{
PStackNode p,q;
if(*LS)
{
p=(*LS)->top;
while(p)
{
q=p;
p=p->next;
free(q);
}
free(*LS);
}
*LS=NULL;
return ;
}
//创建二叉树,按先序创建
BTree CreatTree()
{
char ch;
BTree T;
ch=getchar();
if(ch=='#')//#代替空节点
T=NULL;
else
{
T=(BTree)malloc(sizeof(Bnode));
T->data=ch;
T->left=CreatTree();
T->right=CreatTree();
}
return T;
}
//先序非递归遍历
void PreTree(BTree T)
{
PLinkStack S;
BTree p=T;
S=Init_LinkStack();//创建空栈
while(p||!Empty_LinkStack(S))
{
if(p)
{
printf("%c ",p->data);//访问根节点
Push_LinkStack(S,p);
p=p->left;
}
else
{
Pop_LinkStack(S,&p);
p=p->right;
}
}
}
//中序非递归遍历二叉树
void InTree(BTree T)
{
PLinkStack S;
BTree p=T;
S=Init_LinkStack();
while(p||!Empty_LinkStack(S))
{
if(p)
{
Push_LinkStack(S,p);
p=p->left;
}
else
{
Pop_LinkStack(S,&p);
printf("%c ",p->data);
p=p->right;
}
}
}
//后序遍历二叉树,方法1:二叉树采用左,右,根的遍历顺序,我们按照根,右,左
//的顺序访问,采用两个栈,一个访问,一个保存。
void PostTree1(BTree T)
{
PLinkStack S1,S2;
BTree p=T;
S1=Init_LinkStack();
S2=Init_LinkStack();
while(p||!Empty_LinkStack(S2))
{
if(p)
{
Push_LinkStack(S1,p);
Push_LinkStack(S2,p);
p=p->right;
}
else
{
Pop_LinkStack(S2,&p);
p=p->left;
}
}
while(!Empty_LinkStack(S1))
{
Pop_LinkStack(S1,&p);
printf("%c ",p->data);
}
}
/*
//后序遍历的另一种算法,设置标志量flag,当为0是代表第一次出栈,此时还要入栈一次,不然无法访问此树的右节点,
//当flag=1,时。此时就可以访问了
void PostTree2(BTree T)
{
PLinkStack S;
Data1 sq;
BTree p=T;
S=Init_LinkStack();
while(p||!Empty_LinkStack(S))
{
if(p)
{
sq.flag=0;
sq.node=p;
Push_LinkStack(S,sq);
p=p->left;
}
else
{
Pop_LinkStack(S,&sq);
p=sq.node;
if(sq.flag==0)
{
sq.flag=1;
Push_LinkStack(S,sq);
p=p->right;
}
else
{
printf("%c ",p->data);
p=NULL;
}
}
}
}*/
int main()
{
BTree T;
printf("按先序创建二叉树:");
T=CreatTree();
printf("\n");
printf("中序遍历结果:");
InTree(T);
printf("\n");
printf("后序遍历结果:");
//printf("方法1:");
PostTree1(T);
printf("\n");
// printf("方法2:");
// PostTree2(T);
return 0;
}
二叉树的非递归实现
最新推荐文章于 2021-11-14 21:48:50 发布