有关二叉树的其他基本功能下篇再更新。。。
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define OVERFLOW -1
#define ERROR 0
typedef int Status;
typedef char TElemType;
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode, *BiTree;
//创建
Status CreatBiTree(BiTree &T)
{
char ch;
scanf("%c",&ch);
if(ch == '#') //空树
T = NULL;
else{
T = (BiTNode*)malloc(sizeof(BiTNode));
if(!T) exit(OVERFLOW);
T->data = ch; //生成根结点
CreatBiTree(T->lchild); //构造左子树
CreatBiTree(T->rchild); //构造右子树
}
return OK;
}
//先序遍历
Status PreOrderTraverse(BiTree T)
{
if(T){
printf("%c\t",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
return OK;
}
//中序遍历
Status InOrderTraverse(BiTree T)
{
if(T){
InOrderTraverse(T->lchild );
printf("%c\t",T->data);
InOrderTraverse(T->rchild);
}
return OK;
}
//后序遍历
Status PostOrderTraverse(BiTree T)
{
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c\t",T->data);
}
return OK;
}
//测树的宽度
int Width(BiTree T)//求二叉树bt的最大宽度
{
if (T==NULL)
return (0); //空二叉树宽度为0
else
{
BiTree Q[100],p;//Q是队列,元素为二叉树结点指针,容量足够大
int front=1,rear=1,last=1;//front队头指针,rear队尾指针,last同层最右结点在队列中的位置
int temp=0,maxw=0; //temp记局部宽度, maxw记最大宽度
Q[rear]=T; //根结点入队列
while(front<=last)
{
p=Q[front++];
temp++; //同层元素数加1
if (p->lchild!=NULL) Q[++rear]=p->lchild; //左子女入队
if (p->rchild!=NULL) Q[++rear]=p->rchild; //右子女入队
if (front>last) //一层结束,
{
last=rear;
if(temp>maxw) maxw=temp;//last指向下层最右元素, 更新当前最大宽度
temp=0;
}//if
}//while
return (maxw);
}//结束width
}
//左右子树互换
void ChangeLR(BiTree &T)
{
BiTree temp;
if(T->lchild==NULL&&T->rchild==NULL)
return;
else
{
temp = T->lchild;
T->lchild = T->rchild;
T->rchild = temp;
}//交换左右孩子
ChangeLR(T->lchild); //递归交换左子树
ChangeLR(T->rchild); //递归交换右子树
}
//销毁
Status DestroyBiTree(BiTree &T)
{
if(T){
DestroyBiTree(T->lchild );
DestroyBiTree(T->rchild );
free(T);
}
return OK;
}
//打印
void PrintMenu(){
printf("**********二叉树的应用*************\n");
printf("* 1.创建二叉树 *\n");
printf("* 2.先序遍历二叉树 *\n");
printf("* 3.中序遍历二叉树 *\n");
printf("* 4.后序遍历二叉树 *\n");
printf("* 5.左右子树互换 *\n");
printf("* 6.测得宽度 *\n");
printf("* 7.销毁二叉树 *\n");
printf("* 0.退出 *\n");
printf("***********************************\n");
}
int main()
{
int action;
BiTree T;
while(1){
PrintMenu();
fflush(stdin);
printf("请输入指令:");
scanf("%d",&action);
fflush(stdin);
switch(action)
{
case 1:system("cls");
printf("请按先序遍历方式输入:");
CreatBiTree(T);
printf("二叉树创建成功!\n\n");
break;
case 2:system("cls");
printf("先序遍历二叉树:");
PreOrderTraverse(T);
printf("\n\n");
break;
case 3:system("cls");
printf("中序遍历二叉树:");
InOrderTraverse(T);
printf("\n\n");
break;
case 4:system("cls");
printf("后序遍历二叉树:");
PostOrderTraverse(T);
printf("\n\n");
break;
case 5:
system("cls");
printf("左右子树互换:");
ChangeLR(T);
PreOrderTraverse(T);
printf("\n");
break;
case 6:
int n;
n=Width(T);
printf("树的宽度: %d\n", n);
break;
case 7:system("cls");
if(DestroyBiTree(T))
printf("二叉树销毁成功!!!\n");
break;
case 0:
exit(1);break;
default:
system("cls");
printf("输入命令错误!请重新输入:\n");
break;
}
}
return 0;
}