#include<iostream>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
/*typedef enum PointerTag{
Link,Thread
};*/
typedef struct Node{
char data;
struct Node *left,*right;
//PointTag LTag,RTag;(BiThrTree)
}*BiTree,BiNode;
stack<BiTree>s;
queue<BiTree>line;
void PreorderTraverse(BiTree T){
if(T==nullptr){
return;
}
else{
cout<<T->data;
PreorderTraverse(T->left);
PreorderTraverse(T->right);
}
}//前序遍历
void InorderTraverse(BiTree T){
if(T==nullptr){
return;
}
else{
InorderTraverse(T->left);
cout<<T->data;
InorderTraverse(T->right);
}
}//中序遍历
void PostorderTraverse(BiTree T){
if(T==nullptr){
return;
}
else{
PostorderTraverse(T->left);
PostorderTraverse(T->right);
cout<<T->data;
}
}//后序遍历
//非递归式遍历(中序)
void another(BiTree T){
BiTree p=T;
while(p||!s.empty()){
if(p){
//printf("%d",p->data)
s.push(p);
p=p->left;
}
else{
BiTree q=s.top();
printf("%c",q->data);
s.pop();
//p=p->right;(前序遍历非递归算法)
p=q->right;
}
}
}//中序遍历二叉树的非递归算法
void queueTraverse(BiTree T){
line.push(T);
while(!line.empty()){
BiTree p=line.front();
printf("%c",p->data);
line.pop();
if(p->left!=nullptr){
line.push(p->left);
}
if(p->right!=nullptr){
line.push(p->right);
}
}
}//层次遍历二叉树
void CreateBiTree(BiTree &T){
char n;
cin>>n;
if(n=='#'){
T=nullptr;
}
else{
T=new BiNode;
T->data=n;
CreateBiTree(T->left);
CreateBiTree(T->right);
}
}//先序遍历二建立二叉树
void CopyBiTree(BiTree T,BiTree &NewT){
if(T==nullptr){
NewT=nullptr;
return;
}
else{
NewT=new BiNode;
NewT->data=T->data;
CopyBiTree(T->left,NewT->left);
CopyBiTree(T->right,NewT->right);
}
}//复制二叉树递归法
int Depth(BiTree T){
if(T==nullptr){
return 0;
}
else{
int m=Depth(T->left);
int n=Depth(T->right);
return max(m+1,n+1);
}
}
int NodeCount(BiTree T){
if(T==nullptr)
return 0;
else{
return NodeCount(T->left)+NodeCount(T->right)+1;
}
}//统计结点个数
int LeadCount(BiTree T) {
if (T==nullptr)
return 0;
if (T->left == nullptr && T->right == nullptr) {
return 1;
} else
return LeadCount(T->left) + LeadCount(T->right);
}
/*void InOrderThreading(BiTree &The,BiTree T){
The=new BiThrTree;
The->LTag=Link;The->RTag=Thread;
The=The->right;
if(!T)
The=The->left;
else{
The->left=T;pre=The;
InThreading(T);
pre->right=The;pre->RTag=Thread;
The->right=pre;
}
}
void InThreading(BiThrTree){
if(p){
InTreading(p->left);
if(!p->left){
p->LTag=Thread;
p->left=pre;
}
if(!pre->right){
pre->RTag=Thread;
pre->right=p;
}
pre=p;
InTreading(p->right);
}*/
//二叉树线索化(中序遍历)
int main(){
BiTree T,Thr;
CreateBiTree(T);
CopyBiTree(T,Thr);
printf("前序遍历的顺序为:");
PreorderTraverse(T);
printf("\n");
printf("中序遍历的顺序为:");
InorderTraverse(T);
printf("\n");
another(T);
printf("\n");
printf("后序遍历的顺序为:");
PostorderTraverse(T);
printf("\n");
printf("层次遍历的顺序为:");
queueTraverse(T);
printf("\n");
int res= Depth(T);
int cnt= NodeCount(T);
printf("%d %d",res,cnt);
return 0;
}