一个具有操作菜单的二叉树基本操作。
功能包括:
1.通过先序法创建二叉树;
2.然后实现先序、中序、后序和按层遍历二叉树;
3.实现求二 叉树的总结点数、叶子节点树、单、双分支节点个数;
4.实现求二 叉树的深度;
5.交换二叉树的左右子树等。
#include<bits/stdc++.h>
using namespace std;
#define TElemType char
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
BiTree p;//全局变量,用于函数中的操作
void CreateBiTree(BiTree &T)
{
//先序遍历的顺序建立二叉树
char ch;//存入的元素
cin>>ch;
if(ch=='#') T=NULL;
else
{
T=new BiTNode;
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void PreOrderTraverse(BiTree T)
{
//先序遍历二叉树
if(T)
{
cout<<T->data<<" ";
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void InOrderTraverse(BiTree T)
{
//中序遍历二叉树
if(T)
{
InOrderTraverse(T->lchild);
cout<<T->data<<" ";
InOrderTraverse(T->rchild);
}
}
void PostOrderTraverse(BiTree T)
{
//后序遍历二叉树
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data<<" ";
}
}
void LevelOrderTraverse(BiTree T)
{
//按层遍历
queue<BiTree> Q;//按层遍历中使用的队列,需加队列头文件
if(T)
{
Q.push(T);//先将根存入队列
while(!Q.empty())
{
p=Q.front();
cout<<p->data<<" ";
Q.pop();
if(p->lchild)
Q.push(p->lchild);
if(p->rchild)
Q.push(p->rchild);
}
}
}
void ChangeChild(BiTree &T) //交换左右子树
{
if(T->lchild&&T->rchild)
{
p=T->lchild;
T->lchild=T->rchild;
T->rchild=p;
ChangeChild(T->lchild);
ChangeChild(T->rchild);
}
else if(T->lchild)
{
T->rchild=T->lchild;
T->lchild=NULL;
ChangeChild(T->rchild);
}
else if(T->rchild)
{
T->lchild=T->rchild;
T->rchild=NULL;
ChangeChild(T->lchild);
}
}
int Depth(BiTree T)
{
//计算二叉树的深度
if(!T)
return 0;
else
return max(Depth(T->lchild),Depth(T->rchild)) + 1;
}
int NodeCount(BiTree T)
{
//计算二叉树节点数
if(!T)
return 0;
else
return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
}
int LeafCount(BiTree T)
{
//计算二叉树叶子节点数
if(T->lchild&&T->rchild)
return LeafCount(T->lchild) + LeafCount(T->rchild);
else if(T->lchild)
{
return LeafCount(T->lchild);
}
else if(T->rchild)
{
return LeafCount(T->rchild);
}
else
return 1;
}
int SingleCount(BiTree T)
{
//计算单分支节点个数
if(T->lchild&&T->rchild)
return SingleCount(T->lchild) + SingleCount(T->rchild);
else if(T->lchild)
{
return SingleCount(T->lchild) + 1;
}
else if(T->rchild)
{
return SingleCount(T->rchild) + 1;
}
else
return 0;
}
int BothCount(BiTree T)
{
//计算双分支节点个数
if(T->lchild&&T->rchild)
return BothCount(T->lchild) + BothCount(T->rchild) + 1;
else if(T->lchild)
{
return BothCount(T->lchild);
}
else if(T->rchild)
{
return BothCount(T->rchild);
}
else
return 0;
}
int main()
{
BiTree T;
while(true)
{
system("cls");
cout<<"--二叉树的基本操作--"<<endl;
cout<<" 1.先序创建二叉树"<<endl;
cout<<" 2.先序遍历二叉树"<<endl;
cout<<" 3.中序遍历二叉树"<<endl;
cout<<" 4.后序遍历二叉树"<<endl;
cout<<" 5.按层遍历二叉树"<<endl;
cout<<" 6.二叉树总节点数"<<endl;
cout<<" 7.叶子节点数"<<endl;
cout<<" 8.单分支节点个数"<<endl;
cout<<" 9.双分支节点个数"<<endl;
cout<<" a.二叉树深度"<<endl;
cout<<" b.交换左右子树"<<endl;
cout<<" c.退出"<<endl;
cout<<"请输入选择:";
char choice;
cin>>choice;
switch(choice)
{
case '1':
CreateBiTree(T);
break;
case '2':
PreOrderTraverse(T);
break;
case '3':
InOrderTraverse(T);
break;
case '4':
PostOrderTraverse(T);
break;
case '5':
LevelOrderTraverse(T);
break;
case '6':
cout<<NodeCount(T);
break;
case '7':
cout<<LeafCount(T);
break;
case '8':
cout<<SingleCount(T);
break;
case '9':
cout<<BothCount(T);
break;
case 'a':
cout<<Depth(T);
break;
case 'b':
ChangeChild(T);
break;
case 'c':
exit(0);
default:
cout<<"请输入正确选项!"<<endl;
break;
}
cout<<endl;
system("pause");
}
}