#include<iostream>
#include<queue>
using namespace std;
#include<stdlib.h>
typedef struct BiTNode{
char data ;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void Visit(char data){
cout<<" "<<data ;
}
void PreOrderTraverse(BiTree &T){
//后序遍历二叉树
if(T){
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
Visit(T->data);
}
}
void FrontOrderTraverse(BiTree &T){
//前序后序遍历二叉树
if(T){
Visit(T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void MIDOrderTraverse(BiTree &T){
//中序遍历二叉树
if(T){
PreOrderTraverse(T->lchild);
Visit(T->data);
PreOrderTraverse(T->rchild);
}
}
void CreatBiTree(BiTree &T){
//先序创建二叉树
char ch ;
cin>>ch;
if(ch=='#') {
T= NULL;
cout<<"读了一个#"<<endl;
}
else{
T = new BiTNode;
T->data = ch ;
cout<<"存入" <<ch<<endl;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
}
void destroyBiTree(BiTree &T){
//销毁一课二叉树
if(T){
cout<<"销毁结点上的元素为:"<<T->data<<endl;
destroyBiTree(T->lchild);
destroyBiTree(T->rchild);
delete T;
T = NULL;
}
}
int leafCountOfBiTree(BiTree &T){
//递归求二叉树的叶子结点个数
if(T==NULL)
return 0;
if(T->lchild==NULL && T->rchild==NULL)
return 1;
return leafCountOfBiTree(T->lchild) + leafCountOfBiTree(T->rchild);
}
void Layer_order(BiTree &T){
//按层遍历
queue<BiTree> q ;//调用stl
q.push(T);//先将头结点存入
while(!q.empty()){//判空
BiTree T2= q.front();//头结点取出
q.pop();//头结点退队
cout<<" " <<T2->data;//输出
if(T2->lchild){
q.push(T2->lchild);//存入左孩子
}
if(T2->rchild){
q.push(T2->rchild);//右孩子
}
}
}
//void InOrderTraverse(BiTree T){
// //栈实现前序遍历
// BiTree p ;
// InitStack(S);
// Push(S,T)//让根进栈
// while(!StackEmpty(S)){//判空
// while(GetTop(S,p)&&p)
// Push(S,p->lchild)
// Pop(S,p);
// if(!StackEmpty(S)){
// Pop(S,p);//或者当前栈
// visit(p->data);//得到当前数据
// Push(S,p->rchild);//右儿子进栈
// }
// }
//}
//void InOrderTraverse(BiTree T){
// //栈遍历
// BiTree p;
// InitStack(S);
// p = T;
// while(p||!StackEmpty(S)){
// //判断左树是否有左孩子
// if(p){
// Push(S,p);
// p = p->lchild;
// }else{
// Pop(S,p);
// visit(p->data);
// p = p->rchild;
// }
// }
//}
//void ArrangeTraverse(BiTree T){
// //
// BiTree p;
// while(front<rear){
// p = Queue[++front];
// visit(p->data);
// if(p->lchild!=NULL{
// Queue[++rear] = p->lchild;
// }
// }
//}
int main(){
BiTree T ;
CreatBiTree(T);
cout<<"开始按层遍历咯!"<<endl;
// cout<<"后序:"<<endl;
// PreOrderTraverse(T);
// cout<<endl<<"前序:";
// FrontOrderTraverse(T);
// cout<<endl<<"中序:";
// MIDOrderTraverse(T);
// cout<<endl<<"叶子结点个数为:"<<leafCountOfBiTree(T)<<endl;
Layer_order(T);
// destroyBiTree(T);
return 0;
}