#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
typedef int Status;
typedef char TElemType;
//typedef int QElemType;
typedef struct BiNode//定义树的结点
{
TElemType data;
struct BiNode* lchild, * rchild;
}BiNode,*BiTree;
typedef struct QNode { // 结点类型
TElemType data;
struct QNode *next;
} QNode, *QueuePtr;
typedef struct
{ // 链队列类型
QueuePtr front; // 队头指针
QueuePtr rear; // 队尾指针
} LinkQueue;
Status InitQueue(LinkQueue& Q)//初始化
{
Q.front = Q.rear = new QNode;//创建一个节点,Q.front和Q.rear都是指向一个节点,像定义的节点那种构造类型
Q.front->next = NULL;//队头节点之后就没有了,即为一个空队列
return OK;
}
Status enQueue(LinkQueue& Q, TElemType e)//将e入队
{
QNode* p;
p = new QNode;//对p进行初始化
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;//在队尾入队
return OK;
}
Status deQueue(LinkQueue& Q, TElemType& a)//出队,并将之返回给e
{
QNode *p=new QNode;
if (Q.front == Q.rear)return ERROR;//空队,没有元素可出了
p = Q.front->next;//p是首元节点
a = p->data;//a是首元节点的data域的值
cout<<a;
Q.front->next = p->next;//头节点的next域(首元节点)变成了第二元素(首元节点的next域)
if (Q.rear == p)Q.rear = Q.front;//如果队尾元素是p(首元节点),这个队为空队(只有一个头节点,头指针尾指针都指向它)
delete p;
return OK;
}
Status QueueEmpty(LinkQueue& Q)
{
if (Q.front == Q.rear) { printf("\n空队列"); return OK; }
else { printf("\n非空队列"); return OK; }
}
//01 构建二叉树的二叉链表;
void CreateBiTree(BiTree& T)//先序遍历创建一个树
{
TElemType ch;
cin >> ch;
if (ch == '#') T = NULL;
else
{
T = new BiNode;
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
//02 先序遍历二叉树中所有结点;
void PreOrderTraverse(BiTree T)//先序遍历输出二叉树
{
if (T)
{
cout << T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//03 中序遍历二叉树中所有结点;
void InOrderTraverse(BiTree T)//中序遍历输出二叉树
{
if (T)
{
InOrderTraverse(T->lchild);
cout << T->data;
InOrderTraverse(T->rchild);
}
}
//04 后序遍历二叉树中所有结点;
void LaOrderTraverse(BiTree T)//后序遍历输出二叉树
{
if (T)
{
InOrderTraverse(T->lchild);
InOrderTraverse(T->rchild);
cout << T->data;
}
}
//05 层次遍历二叉树中所有结点;
void levelOrderTraverse(BiTree T)//层序遍历二叉树
{
BiNode *p;
LinkQueue qu;
InitQueue(qu);
enQueue(qu,p->data);
while(!QueueEmpty(qu))
deQueue(qu,p->data);
cout<<p->data;
if(p->lchild!=NULL)
enQueue(qu,p->lchild->data);
if(p->rchild!=NULL)
enQueue(qu,p->rchild->data);
}
int main()
{
BiTree T;
printf("二叉树的元素是");
CreateBiTree(T);
printf("先序遍历结果");
PreOrderTraverse(T);
printf("\n中序遍历结果");
InOrderTraverse(T);
printf("\n后序遍历结果");
LaOrderTraverse(T);
printf("\n层序遍历结果");
levelOrderTraverse(T);
}
输入
输出结果为