#include<iostream>
#include<stdlib.h>
#define MAX_SIZE 100
using namespace std;
typedef struct Node
{
int data;
struct Node *Lson,*Rson;
}Node;
void BulitTree(Node **node)
{
char a;
cin>>a;
if(a=='#')
{
*node=NULL;
return;
}
int num=a-'0';
(*node)=(Node*)malloc(sizeof(Node));
(*node)->data=num;
BulitTree(&(*node)->Lson);
BulitTree(&(*node)->Rson);
}
void DLR(Node *root)//先序遍历
{
Node *stack[MAX_SIZE],*p,*q;
p=root;
int top=0;
if(p==NULL)
{
cout<<"这是一个空树"<<endl;
return;
}
stack[0]=NULL;//这里因为是指针数组,故地址已经被分配了,因此stack[0]是存在的
do
{
cout<<p->data<<" ";
q=p->Rson;
if(q!=NULL) stack[++top]=q;
p=p->Lson;
if(p==NULL)
{
p=stack[top--];
}
}while(p!=NULL);
cout<<endl;
}
void LDR(Node *root)
{
Node *stack[MAX_SIZE],*p,*q;
int top=0;
p=root;
if(p==NULL)
{
cout<<"这是一个空树"<<endl;
return;
}
do
{
while(p!=NULL)
{
stack[++top]=p;
p=p->Lson;
}
if(!top) break;
p=stack[top--];
cout<<p->data<<" ";
p=p->Rson;
}while(1);
cout<<endl;
}
void LRD(Node *root)
{
Node *stack[MAX_SIZE],*q,*p;
int top=0;
int mark[MAX_SIZE];
p=root;
do
{
while(p!=NULL)
{
stack[++top]=p;
mark[top]=0;
p=p->Lson;
}
if(!top) break;
if(mark[top])
{
p=stack[top--];
cout<<p->data<<" ";
p=NULL;
}
else
{
mark[top]=1;
p=stack[top]->Rson;
}
}while(1);
cout<<endl;
}
int main()
{
int T;
cin>>T;
while(T--)
{
Node *root;
BulitTree(&root);
cout<<"先序遍历结果:";
DLR(root);
cout<<"中序遍历结果:";
LDR(root);
cout<<"后序遍历结果:";
LRD(root);
}
return 0;
}
/*
45
12#4##3#5##
123##45#7##6###
*/
数据结构-二叉树先序中序后序的非递归算法
最新推荐文章于 2022-10-21 11:15:52 发布