#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
/*二叉树的二叉链表存储结构*/
typedef char dataType;
typedef struct node
{
dataType data;
struct node *lchild, *rchild; /**左右孩子指针**/
}*BinTree,BinNode; /**结点类型**/
typedef BinTree QelemType;
typedef struct
{
QelemType num[MaxSize];
int front;
int rear;
} Queue;
Queue Q;
void initilize() ///初始化队列
{
Q.front=0;
Q.rear=0;
}
int Push(BinNode *T) ///入队
{
if((Q.rear+1)==Q.front)
return 0;
else
Q.num[++Q.rear] = T;
return 1;
}
BinNode *Pop() ///出队
{
if(Q.front==Q.rear)
return 0;
return Q.num[++Q.front];
}
int Empty() ///判断对列是否为空
{
if(Q.front==Q.rear)
return 1;
else
return 0;
}
///建立二叉树
int CreateBinTree(BinTree *T)
{
char ch;
scanf("%c",&ch);
if(ch=='#'){
*T=NULL;
}
else
{
*T=(BinTree)malloc(sizeof(BinNode));
if(!(*T)){
return 0;
}
(*T)->data = ch;
CreateBinTree(&(*T)->lchild);
CreateBinTree(&(*T)->rchild);
}
return 1;
}
///中序遍历
void inOder(BinTree T)
{
if(!T)
return ;
if(T)
{
inOder(T->lchild);
printf("%c ", T->data);
inOder(T->rchild);
}
}
///先序遍历
void PreOder(BinTree T)
{
if(!T)
return ;
if(T)
{
printf("%c ", T->data);
PreOder(T->lchild);
PreOder(T->rchild);
}
}
///后序遍历
void PostOder(BinTree T)
{
if(!T)
return ;
if(T)
{
PostOder(T->lchild);
PostOder(T->rchild);
printf("%c ", T->data);
}
}
///二叉树的层次遍历
void LevelOrder(BinTree T)
{
BinNode *temp;
if(!T)
return;
Push(T);
while (!Empty())
{
temp = Pop();
printf("%c ", temp->data); ///输出队首结点
if(temp->lchild) ///把Pop掉的结点的左子结点加入队列
Push(temp->lchild);
if(temp->rchild) ///把Pop掉的结点的右子结点加入队列
Push(temp->rchild);
}
}
///二叉树的深度
int Depth(BinTree T)
{
int hl, hr;
if(!T)
return 0;
else
{
hl=Depth(T->lchild);
hr=Depth(T->rchild);
if(hl>=hr)
return hl+1;
else
return hr+1;
}
}
//二叉树中叶子结点的个数
int LeafCount(BinTree T)
{
if(!T)
return 0;
if(!T->lchild&&!T->rchild)//加1.
{
return 1;
}
else
{
return LeafCount(T->lchild)+LeafCount(T->rchild);
}
}
///交换左右子树
int exchange(BinTree T)
{
BinNode *temp;
if(!T)
return 0;
if(T->lchild==NULL&&T->rchild==NULL)
return 0;
else
{
temp=T->lchild;
T->lchild=T->rchild;
T->rchild=temp;
}
if(T->lchild)
exchange(T->lchild);
if(T->rchild)
exchange(T->rchild);
return 1;
}
void menu()
{
printf("--------------------二叉树的建立与应用-------------------------\n");
printf("\t1.二叉树的中序遍历\n");
printf("\t2.二叉树的前序遍历\n");
printf("\t3.二叉树的后序遍历\n");
printf("\t4.二叉树的层次遍历\n");
printf("\t5.二叉树的深度\n");
printf("\t6.二叉树叶子结点的个数\n");
printf("\t7.二叉树每个结点的左右子树交换位置\n");
printf("\t8.退出系统\n");
printf("----------------------------------------------------------------\n");
}
int main()
{
BinTree T;
int m,leafsize=0;
menu();
printf("按先序序列创建一个二叉树:\n");
if(CreateBinTree(&T)==1)
printf("创建成功!\n");
while(1)
{
printf("请输入序号,实现菜单功能\n");
scanf("%d", &m);
if(m==1)
{
printf("中序遍历为:\n");
inOder(T);
printf("\n");
}
else if(m==2)
{
printf("先序遍历为:\n");
PreOder(T);
printf("\n");
}
else if(m==3)
{
printf("后序遍历为:\n");
PostOder(T);
printf("\n");
}
else if(m==4)
{
printf("层次遍历为:\n");
initilize();
LevelOrder(T);
printf("\n");
}
else if(m==5)
{
printf("二叉树深度为:\n");
printf("%d\n", Depth(T));
}
else if(m==6)
{
leafsize=LeafCount(T);
printf("二叉树叶子结点数为:\n");
printf("%d\n",leafsize);
}
else if(m==7)
{
printf("左右子树进行交换:\n");
if(exchange(T)==1)
printf("交换完成!\n");
printf("交换后中序遍历为:\n");
inOder(T);
printf("\n");
printf("交换后先序遍历为:\n");
PreOder(T);
printf("\n");
printf("交换后后序遍历为:\n");
PostOder(T);
printf("\n");
printf("交换后层次遍历为:\n");
initilize();
LevelOrder(T);
printf("\n");
}
else if(m==8)
{
printf("退出菜单\n");
break;
}
}
return 0;
}
实验四二叉树
最新推荐文章于 2024-01-21 11:48:52 发布