#include <iostream>
using namespace std;
typedef char DataType;
#define FALSE 0
#define TRUE 1
typedef struct BitNode
{DataType data;
struct BitNode *lchild ,*rchild;
}BitNode,*BitTree;
//初始化 二叉树
BitTree BinTreeInit(BitTree BT)
{BT=NULL;
return BT;
}
//按前序建立二叉树
BitTree BinTreeCreat(BitTree BT)
{char ch;
cout<<"输入结点值:";
cin>>ch;
if(ch=='#') BT=NULL;
else
{BT=new BitNode;
BT->data=ch;
BT->lchild=BinTreeCreat(BT->lchild);
BT->rchild=BinTreeCreat(BT->rchild);
}
return BT;
}
//检查二叉树是否为空
int BinTreeEmpty(BitTree BT)
{if(BT==NULL) return TRUE;
else return FALSE;
}
//按前序遍历
void BinTraverse(BitTree BT)
{if(BT)
{cout<<BT->data<<" ";
BinTraverse(BT->lchild);
BinTraverse(BT->rchild);
}
}
//求二叉树的深度
int BinTreeDepth(BitTree BT)
{int i,j;
if(BT==NULL)
return 0;
else
{i=BinTreeDepth(BT->lchild);
j=BinTreeDepth(BT->rchild);
if(i>j) return (i+1);
else return (j+1);
}
}
//求二叉树的所有结点数
int BinTreeCount(BitTree BT)
{//int i,j;
if(BT==NULL)
return 0;
else
{
//i=BinTreeCount(BT->lchild);
//j=BinTreeCount(BT->rchild);
return (BinTreeCount(BT->lchild)+BinTreeCount(BT->rchild)+1);
}
}
//清除二叉树 使之成为空树
BitTree BinTreeClear (BitTree BT)
{if(BT)
{BitTree p;
p=BT;
delete p;
BT->lchild=BinTreeClear(BT->lchild);
BT->lchild=BinTreeClear(BT->lchild);
}
return BT;
}
//层次遍历二叉树
void TravelTree(Tree r)
{
Queue q;
InitQueue(q);
Tree p,p1,p2;
p=r;//(Tree)malloc(sizeof(TreeNode));
if(p)InsqQueue(q,p);
while(!EmptyQueue(q))
{
OutsqQueue(q,p);
printf("%c",p->data);
p1=p->lchild;p2=p->rchild;
if(p1) InsqQueue(q,p1);
if(p2) InsqQueue(q,p2);
}
}
int scan()
{int d;
cout<<"请输入所要进行的操作/n";
cout<<"1 初始化二叉树 , 2 按前序建立二叉树,3 判空, 4 按前序遍历, 5 二叉树的深度 6 二叉树的结点数 7 清空二叉树 、/n";
cout<<"其他键 推出........./n";
cin>>d;
return (d);
}
int main()
{BitTree BT;
BT=BinTreeInit(BT);
int can=0;
int s;
//DataType x;
while(!can)
switch(scan())
{case 1:BT=BinTreeInit(BT);break;
case 2:BT=BinTreeCreat(BT);
break;
case 3:if(BinTreeEmpty(BT))
cout<<"二叉树为空!/n";
else cout<<"二叉树不空!/n";
break;
case 4:if(BinTreeEmpty(BT))
cout<<"二叉树为空!"<<endl;
else {cout<<"二叉树元素为:";
BinTraverse(BT);}
cout<<endl;
break;
case 5:cout<<"二叉树的深度是:"<<BinTreeDepth(BT)<<endl;
break;
case 6:
s=BinTreeCount(BT);
cout<<"二叉树的结点数为:";
cout<<s;
break;
case 7:BT=BinTreeClear(BT);
break;
default:can=1;
}
return 0;
}