#include <iostream>
#include <malloc.h>
#define TElemType char
#define SElemType char
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define MAXQSIZE 100
typedef char QElemType;
typedef int Status;
typedef int Status;
using namespace std;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef struct {
BiTree *base;
char front;
char rear;
}SqQueue;
typedef struct{
BiTree *base;
BiTree *top;
int stacksize;
}SqStack;
Status InitQueue (SqQueue &Q)
{//构造一个空队列
Q.base =new BiTree[MAXQSIZE];
Q.front=Q.rear=0;
return true;
}
Status EnQueue(SqQueue &Q,BiTree e)
{
if((Q.rear+1)%MAXQSIZE==Q.front) return false;
Q.base[Q.rear]=e;
Q.rear = (Q.rear+1) % MAXQSIZE;
return true;
}
Status DeQueue (SqQueue &Q,BiTree &e)
{
if(Q.front==Q.rear) return false;
e=Q.base[Q.front];
Q.front=(Q.front+1) % MAXQSIZE;
return true;
}
Status InitStack( SqStack &S )
{
S.base=new BiTree[STACK_INIT_SIZE];
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return true;
}
bool StackEmpty( SqStack S )
{
if(S.base==S.top)
return true;
return false;
}
Status Pop ( SqStack &S, BiTree & e)
{
if ( S.top == S.base ) return false;
e=*--S.top;
return true;
}//Pop
Status GetTop( SqStack S, BiTree &e)
{ // 若栈不空,则用e返回S的栈顶元素
if( S.top == S.base )
return false;
e=*(S.top - 1 );
return true;
}
Status PushS ( SqStack &S, BiTree e)
{ //插入元素e为新的栈顶元素
if ( S.top-S.base==S.stacksize ) {
S.base=(BiTree*) realloc ( S.base,
(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if (!S.base)exit(10);
S.top=S.base + S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++ = e;
return true;
}//Pus
int PreOrderTraverse(BiTree T){
if(T==NULL) return true; //空二叉树
else{
cout<<T->data; //访问根结点
PreOrderTraverse(T->lchild); //递归遍历左子树
PreOrderTraverse(T->rchild); //递归遍历右子树
}
}
void show_aim()
{
cout<<"1.创建链式二叉树"<<endl;
cout<<"2.前序遍历二叉树"<<endl;
cout<<"3.中序遍历二叉树"<<endl;
cout<<"4.后续遍历二叉树"<<endl;
cout<<"5.层序遍历二叉树"<<endl;
cout<<"6.二叉树的深度--"<<endl;
cout<<"7.非递归中序遍历"<<endl;
cout<<"操作错误"<<endl;
}
int Depth(BiTree T)
{
int m,n;
if(T==NULL) return 0;
else
{
m=Depth(T->lchild); n=Depth(T->rchild);
if (m>=n) return m+1;
else return n+1;
}
}
void CreateBiTree(BiTree &T){
//按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
char ch;
cin >> ch;
if(ch=='#') T=NULL; //递归结束,建空树
else
{
T=new BiTNode;
T->data=ch; //生成根结点
CreateBiTree(T->lchild); //递归创建左子树
CreateBiTree(T->rchild); //递归创建右子树
}
}
Status InOrderTraverse(BiTree T){
if(T==NULL) return true; //空二叉树
else{
InOrderTraverse(T->lchild); //递归遍历左子树
cout<<T->data; //访问根结点
InOrderTraverse(T->rchild); //递归遍历右子树
}
}
Status PostOrderTraverse(BiTree T){
if(T==NULL) return true; //空二叉树
else{
PostOrderTraverse(T->lchild); //递归遍历左子树
PostOrderTraverse(T->rchild); //递归遍历右子树
cout<<T->data; //访问根结点
}
}
Status FInOrderTraverse (BiTree T)
{
SqStack S;
BiTree p;
InitStack(S);PushS(S,T); // 根指针进栈
while ( !StackEmpty(S) )
{
while( GetTop(S, p) && p) PushS( S, p->lchild ); // 向左走到尽头
Pop( S, p ); // 空指针退栈
if ( !StackEmpty(S) )
{ // 访问结点,向右一步
Pop( S, p );
cout<<p->data;
PushS ( S, p->rchild ); // 将右儿子入栈,则下次循环时打印右儿子
} // if
} //while
return true;
}
int EmQueue(SqQueue &Q){
if(Q.front==Q.rear){
return true;
}
return false;
}
void TevalTraverse(BiTree T){
SqQueue Q;
InitQueue(Q);
if(T){
EnQueue(Q,T);
while(EmQueue(Q)==false){
DeQueue(Q,T);
cout<<T->data;
if(T->lchild!=NULL)
EnQueue(Q,T->lchild);
if(T->rchild!=NULL)
EnQueue(Q,T->rchild);
}
}
}
int main()
{
show_aim();
BiTNode* T;
int oper;
cout<<"请输入操作"<<endl;
while(1){
cin>>oper;
if(oper==1)
CreateBiTree(T);
else if(oper==2){
PreOrderTraverse(T);
cout<<endl;
}
else if(oper==3){
InOrderTraverse(T);
cout<<endl;
}
else if(oper==4){
PostOrderTraverse(T);
cout<<endl;
}
else if(oper==5){
TevalTraverse(T);
cout<<endl;
}
else if(oper==6){
cout<<Depth(T)<<endl;
}
else if(oper==7){
FInOrderTraverse (T);
cout<<endl;
}
}
return 0;
}