#include<stdio.h>
#include<iostream>//这两个是c++的头文件,有这两才能使用输入输出
using namespace std;
//定义一个二叉树
typedef struct BiTNode
{
//int data;//这个类型按照自己想输入的为主
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//定义队列
typedef struct queue
{
BiTree data[101];//这个类型?这个data不怕重复?
int head;//头指针
int tail;//尾指针
}queue;
//按照先序遍历的方式,构建我们的二叉树,输入的时候,我们要按照完全二叉树的形式输入,结点为空的位置,输入“#”
int createTree(BiTree &T)
{
char data1;
//cin>>data1;
scanf("%c",&data1);
if(data1=='#')
{
T=NULL;
}
else
{
T=new BiTNode;//开空间
T->data=data1;
createTree(T->lchild); //生成左子树
createTree(T->rchild); //生成右子树
}
return 1;
}
//先序遍历,根左右
int PreOrderTraverse(BiTree T)
{
if(T==NULL)
return 0;
else
{
//cout<<T->data;
printf("%c",T->data);//输出跟结点,即为双亲
PreOrderTraverse(T->lchild); //左孩子递归算法
PreOrderTraverse(T->rchild);//右孩子递归算法
}
return 1;
}
//中序遍历,左根右
int InOrderTraverse(BiTree T)
{
if(T==NULL)
return 0;
else
{
InOrderTraverse(T->lchild); //左孩子递归算法
printf("%c",T->data);//输出跟结点,即为双亲
//cout<<T->data;
InOrderTraverse(T->rchild);//右孩子递归算法
}
return 1;
}
//后序遍历,左右根
int PostOrderTraverse(BiTree T)
{
if(T==NULL)
return 0;
else
{
PostOrderTraverse(T->lchild); //左孩子递归算法
//printf("%c",T->data);//输出跟结点,即为双亲
PostOrderTraverse(T->rchild);//右孩子递归算法
cout<<T->data;
}
return 1;
}
//注意这个细节,在这里的放在层序的上面。
//这个区域关于队的定义,初始化,入队,出队操作
//队初始化
int IntQueue(queue &Q)
{
Q.head=Q.tail=0;//这里已经data已经给了存储空间,在这里不需要再分配
return 1;
}
//入队
int EnQueue(queue &Q,BiTree T)
{
Q.data[Q.tail]=T;//队的队尾指向T结点;
Q.tail++;
return 1;
}
//出队
int DeQueue(queue &Q,BiTree &t)
{
t=Q.data[Q.head];
Q.data[Q.head]=NULL;
Q.head++;//这样的话没有删除,应该比较浪费空间
return 1;
}
//层序,配合队列处理
int LevelOrderTraverse(BiTree T)
{
queue Q;//对于队来说这里就是主函数区域
IntQueue(Q); //队的初始化
BiTree t;//我觉得在这里弄一个t而不动T是为了防止T丢了
EnQueue(Q,T);//入队入队
while(Q.head!=Q.tail)
{
DeQueue(Q,t);//出队;
printf("%c",t->data); //打印出队元素
if(t->lchild!=NULL) //若为空则没必要进行出队
EnQueue(Q,t->lchild);
if(t->rchild!=NULL)//判断右
EnQueue(Q,t->rchild);
}
return 1;
}
int main()
{
//ABC##DE#G##F###
printf("阿祥玩二叉树\n");
printf("先序构造一棵二叉树(左右孩子为空用#表示)\n");
printf("怎么结束?,好像要填满三层\n");
BiTree T;
createTree(T);//先序遍历二叉树
//先序遍历
//cout<<"先序遍历的序列为"<<endl; //c++写法
printf("先序遍历的序列为:\n");
PreOrderTraverse(T);
printf("\n\n");
//中序遍历
printf("中序遍历的序列为:\n");
InOrderTraverse(T);
printf("\n\n");
//后序遍历
printf("后序遍历的序列为:\n");
PostOrderTraverse(T);
printf("\n\n");
//层序遍历
//层序遍历得配合队来操作,队是以先进先出,先出队第一个根结点然后入队 左右孩子
//然后左作为根结点出队,再将左的两个孩子入队,这样就得到层序效果
printf("层序遍历的序列为:\n");
LevelOrderTraverse(T);
printf("\n\n");
printf("敲完耗时两个半小时\n");
printf("收工干饭\n");
return 0;
}
数据结构遍历
于 2023-05-03 19:32:16 首次发布