#include<iostream>
using namespace std;
typedef struct Node{
char data;
struct Node *lchild,*rchi
ld;
}BTreeNode,*BTree;
void InitBT(BTree &BT)//初始化二叉树BT
{
BT=NULL;
}
void CreateBT(BTree &BT)//根据字符串a所给出的二叉树描述,建立二叉链表存储结构
{
char ch;
cin>>ch;
if(ch=='#')BT=NULL;
else{
BT=new BTreeNode;
BT->data=ch;
CreateBT(BT->lchild);
CreateBT(BT->rchild);
}
}
int EmptyBT(BTree BT)//判空
{
if(BT==NULL)return 1;//空返回1
return 0;
}
int DepthBT(BTree BT)//求深度
{
if(BT==NULL)return 0;
else{
int m=DepthBT(BT->lchild);
int n=DepthBT(BT->rchild);
if(m>n)return(m+1);
else return(n+1);
}
}
int NodeCount(BTree BT)//求结点个数
{
if(BT==NULL)return 0;
else return NodeCount(BT->lchild)+NodeCount(BT->rchild)+1;
}
void PreOrder(BTree BT)//先序遍历 递归
{
if(BT)
{
cout<<BT->data;
PreOrder(BT->lchild);
PreOrder(BT->rchild);
}
}
void InOrder(BTree BT)//中序遍历 递归
{
if(BT)
{
PreOrder(BT->lchild);
cout<<BT->data;
PreOrder(BT->rchild);
}
}
void PostOrder(BTree BT)//后序遍历 递归
{
if(BT)
{
PreOrder(BT->lchild);
PreOrder(BT->rchild);
cout<<BT->data;
}
}
int FindBT(BTree BT,char x)
{
if(BT)
{
if(BT->data==x)return 1;
if(BT->lchild)FindBT(BT->lchild,x);
if(BT->rchild)FindBT(BT->rchild,x);
}
else return 0;
}
void DestroyBT(BTree &BT)
{
BT=NULL;
delete BT;
}
void ExchangeBT(BTree &BT)
{
BTree temp;
if(BT){
temp=BT->lchild;
BT->lchild=BT->rchild;
BT->rchild=temp;
ExchangeBT(BT->rchild);
ExchangeBT(BT->lchild);
}
}
void main()
{
BTree BT;
char ch=0;
cout<<"20-8软工2-9-115"<<endl;
cout<<"初始化二叉树"<<endl;
InitBT(BT);
if(EmptyBT(BT))cout<<"该二叉树为空"<<endl;
cout<<"先序构建二叉树,输入元素,输入#结束"<<endl;
CreateBT(BT);
if(!EmptyBT(BT))cout<<"二叉树创建成功"<<endl;
cout<<"二叉树BT的深度为"<<DepthBT(BT)<<endl;
cout<<"二叉树BT共有"<<NodeCount(BT)<<"个结点"<<endl;
cout<<"先序遍历二叉树"<<endl;
PreOrder(BT);cout<<endl;
cout<<"中序遍历二叉树"<<endl;
InOrder(BT);cout<<endl;
cout<<"后序遍历二叉树"<<endl;
PostOrder(BT);cout<<endl;
cout<<"输入要查找的值"<<endl;
cin>>ch;
if(FindBT(BT,ch))cout<<"查找成功"<<endl;
else cout<<"查找失败"<<endl;
cout<<"交换左右子树"<<endl;
ExchangeBT(BT);
cout<<"先序遍历二叉树"<<endl;
PreOrder(BT);cout<<endl;
cout<<"中序遍历二叉树"<<endl;
InOrder(BT);cout<<endl;
cout<<"后序遍历二叉树"<<endl;
PostOrder(BT);cout<<endl;
DestroyBT(BT);
}