#include<iostream>
using namespace std;
struct BiNode
{
char data;
BiNode* lchile, * rchile;
};
class BiTree
{
public:
BiTree() { root = Creat(); }
void PreOrder() { PreOrder(root); }
void InOrder() { InOrder(root); }
void LastOrder() { LastOrder(root); }
void LeverOrder();
private:
BiNode* Creat();
void PreOrder(BiNode* bt);
void InOrder(BiNode* bt);
void LastOrder(BiNode* bt);
BiNode* root;
};
BiNode* BiTree::Creat()
{
BiNode* bt;
char ch;
cin >> ch;
if (ch == '#')return bt = NULL;
else
{
bt = new BiNode;
bt->data = ch;
bt->lchile = Creat();
bt->rchile = Creat();
}return bt;
}
void BiTree::PreOrder(BiNode* bt)
{
if (bt == NULL)return;
else
{
cout << bt->data << " ";
PreOrder(bt->lchile);
PreOrder(bt->rchile);
}
}
void BiTree::InOrder(BiNode* bt)
{
if (bt == NULL)return;
else
{
InOrder(bt->lchile);
cout << bt->data << " ";
InOrder(bt->rchile);
}
}
void BiTree::LastOrder(BiNode* bt)
{
if (bt == NULL)return;
else
{
LastOrder(bt->lchile);
LastOrder(bt->rchile);
cout << bt->data << " ";
}
}
void BiTree::LeverOrder()
{
BiNode* Q[100], * q = NULL;
int front = -1, rear = -1;
if (root == NULL)return;
else
{
Q[++rear] = root;
}
while (rear!=front)
{
q = Q[++front];
cout << q->data << " ";
if (q->lchile != NULL) Q[++rear] = q->lchile;
if (q->rchile != NULL)Q[++rear] = q->rchile;
}
}
int main()
{
//测试代码:AB#D##C##
BiTree s;
cout << "前序遍历 " << endl;
s.PreOrder();
cout << endl;
cout << "中序遍历" << endl;
s.InOrder();
cout << endl;
cout << "后序遍历" << endl;
s.LastOrder();
cout << endl;
cout << "层序遍历" << endl;
s.LeverOrder();
}