// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
const int MAXSIZE = 10;
int i = 0;
int da[] = { 3, 1, 2, -1, -1, -1, 4, 6, -1, -1, 7, -1, -1 };
typedef struct BNode{
int data;
struct BNode*rchild, *lchild;
}BNode;
typedef struct QNode{
BNode* data[MAXSIZE];
int front, rear;
}QNode;
void Init(QNode*&Q)//初始化队列
{
Q = (QNode*)malloc(sizeof(QNode));
Q->front = Q->rear = 0;
}
int Push(QNode*Q, BNode* x)//入队列
{
if ((Q->rear + 1) % MAXSIZE == Q->front)
return 0;
else
{
Q->data[(Q->rear + 1) % MAXSIZE] = x;
Q->rear = (Q->rear + 1) % MAXSIZE;
return 1;
}
}
int Pop(QNode*Q, BNode* &x)//出队列
{
if (Q->front == Q->rear)
return 0;
else
{
x = Q->data[(Q->front + 1) % MAXSIZE];
Q->front = (Q->front + 1) % MAXSIZE;
return 1;
}
}
void CreateBtree(BNode* &p)//中序遍历建立二叉树
{
int data;
//cin >> data;
data = da[i++];
if (data != -1)
{
p = (BNode*)malloc(sizeof(BNode));
p->data = data;
CreateBtree(p->lchild);
CreateBtree(p->rchild);
}
else
{
p = NULL;
}
}
int VisitFirst(BNode*p)//递归先序遍历
{
if (p)
{
cout << p->data << ' ';
VisitFirst(p->lchild);
VisitFirst(p->rchild);
return 1;
}
else
return 0;
}
int VisitMid(BNode*p)//递归中序遍历
{
if (p)
{
VisitMid(p->lchild);
cout << p->data << ' ';
VisitMid(p->rchild);
return 1;
}
else
return 0;
}
int VisilLast(BNode*p)//递归后序遍历
{
if (p)
{
VisilLast(p->lchild);
VisilLast(p->rchild);
cout << p->data << ' ';
return 1;
}
else
return 0;
}
int Visit(BNode *p)//层序遍历
{
QNode *q;
BNode *m;
Init(q);
if (p)
{
Push(q, p);
while (q->front != q->rear)//判断队列是否为空
{
Pop(q, m);
cout << m->data << ' ';
if (m->lchild)
Push(q, m->lchild);
if (m->rchild)
Push(q, m->rchild);
}
return 1;
}
else
return 0;
}
int VisitFirst1(BNode*p)//非递归先序遍历
{
if (p)
{
BNode* Stack[MAXSIZE];
int top = -1;
Stack[++top] = p;
BNode*m;
while (top!=-1)
{
m = Stack[top--];
cout << m->data << ' ';
if (m->rchild)
Stack[++top] = m->rchild;
if (m->lchild)
Stack[++top] = m->lchild;
}
return 1;
}
else
{
return 0;
}
}
int VisitLast1(BNode*p)//非递归后序遍历
{
if (p)
{
BNode* Stack1[MAXSIZE], *Stack2[MAXSIZE];
int top1=-1, top2=-1;
Stack1[++top1] = p;
BNode*m;
while (top1!=-1)
{
m = Stack1[top1--];
Stack2[++top2] = m;
if (m->lchild)
Stack1[++top1]=m->lchild;
if (m->rchild)
Stack1[++top1] = m->rchild;
}
while (top2!=-1)
{
cout << Stack2[top2--]->data << ' ';
}
return 1;
}
else
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
BNode *p;
CreateBtree(p);
cout << "先序遍历:";
VisitFirst(p);
cout << "\n中序遍历:";
VisitMid(p);
cout << "\n后序遍历:";
VisilLast(p);
cout << "\n层序遍历:";
Visit(p);
cout << "\n非递归先序遍历:";
VisitFirst1(p);
cout << "\n非递归后序遍历:";
VisitLast1(p);
cout << endl;
return 0;
}