#include<stdlib.h>
#include"Queue.h"
typedef BinTree Element; //定义队列元素类型
typedef int ElementType;
typedef struct TNode *BinTree;
struct TNode {
ElementType data;
BinTree left;
BinTree right;
};
BinTree CreatTree(); //层序生成二叉树,输入data值为0则该结点为空
void LevelorderTraveral(BinTree BT);
void PreorderTraversal(BinTree BT); //先序遍历
void InorderTraversal(BinTree BT); //中序遍历
void PostorderTraversal(BinTree BT); //后序遍历
int main()
{
BinTree BT = CreatTree();
LevelorderTraveral(BT);
cout << endl;
InorderTraversal(BT);
cout << endl;
PreorderTraversal(BT); //先序遍历
cout << endl;
PostorderTraversal(BT); //后序遍历
cout << endl;
return 0;
}
BinTree CreatTree()
{
ElementType data;
cin >> data;
if (!data) return NULL;
BinTree BT,head; //设置局部执行指针BT,以及头结点指针head
ProToQueue Q = CreatQueue(100); //定义一个容量为一百的队列Q;
head = BT = (BinTree)malloc(sizeof(struct TNode));
BT->data = data;
BT->left = NULL;
BT->right = NULL;
AddQ(Q, BT);
while (!IsEmpty(Q))
{
BT = DeleteQ(Q);
ElementType left, right;
cin >> left >> right;
if (left)
{
BT->left = (BinTree)malloc(sizeof(struct TNode));
BT->left->data = left;
BT->left->left = NULL;
BT->left->right = NULL;
AddQ(Q, BT->left);
}
if (right)
{
BT->right= (BinTree)malloc(sizeof(struct TNode));
BT->right->data = right;
BT->right->left = NULL;
BT->right->right = NULL;
AddQ(Q, BT->right);
}
}
return head;
}
void LevelorderTraveral(BinTree BT)
{
if (!BT) return;
ProToQueue Q = CreatQueue(100);
cout << BT->data << " ";
AddQ(Q, BT);
while (!IsEmpty(Q))
{
BinTree T = DeleteQ(Q);
if (T->left)
{
cout << T->left->data << " ";
AddQ(Q, T->left);
}
if (T->right)
{
cout << T->right->data << " ";
AddQ(Q, T->right);
}
}
}
void InorderTraversal(BinTree BT) //中序遍历
{
if (!BT) return;
InorderTraversal(BT->left);
cout << BT->data << " ";
InorderTraversal(BT->right);
}
void PreorderTraversal(BinTree BT) //先序遍历
{
if (!BT) return;
cout << BT->data << " ";
PreorderTraversal(BT->left);
PreorderTraversal(BT->right);
}
void PostorderTraversal(BinTree BT) //后序遍历
{
if (!BT) return;
PostorderTraversal(BT->left);
PostorderTraversal(BT->right);
cout << BT->data << " ";
}