#include "string.h"
#include "stdio.h"
#include "stdlib.h"
//#include "io.h"
#include "math.h"
#include "time.h"
#define maxsize 7
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
#include "stdio.h"
#include "stdlib.h"
//#include "io.h"
#include "math.h"
#include "time.h"
#define maxsize 7
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
/* 用于构造二叉树********************************** */
int zb=1;
typedef char String[24]; /* 0号单元存放串的长度 */
String str;
typedef char TElemType;
TElemType Nil=' '; /* 字符型以空格符为空 */
int zb=1;
typedef char String[24]; /* 0号单元存放串的长度 */
String str;
typedef char TElemType;
TElemType Nil=' '; /* 字符型以空格符为空 */
typedef struct BiTNode /* 结点结构 */
{
TElemType data; /* 结点数据 */
struct BiTNode *lchild,*rchild; /* 左右孩子指针 */
}BiTNode,*BiTree;
{
TElemType data; /* 结点数据 */
struct BiTNode *lchild,*rchild; /* 左右孩子指针 */
}BiTNode,*BiTree;
void CreateBiTree(BiTree *T)
{
TElemType ch;
printf("请输入一个字符:\n");
scanf("%c",&ch);
getchar();
if(ch=='#')
*T=NULL;
else
{
*T=(BiTree)malloc(sizeof(BiTNode));
if(!*T)
exit(OVERFLOW);
(*T)->data=ch; /* 生成根结点 */
CreateBiTree(&(*T)->lchild); /* 递归构造左子树 */
CreateBiTree(&(*T)->rchild); /* 递归构造右子树 */
}
}
{
TElemType ch;
printf("请输入一个字符:\n");
scanf("%c",&ch);
getchar();
if(ch=='#')
*T=NULL;
else
{
*T=(BiTree)malloc(sizeof(BiTNode));
if(!*T)
exit(OVERFLOW);
(*T)->data=ch; /* 生成根结点 */
CreateBiTree(&(*T)->lchild); /* 递归构造左子树 */
CreateBiTree(&(*T)->rchild); /* 递归构造右子树 */
}
}
int main()
{
BiTree T;
printf("请创建一个二叉树\n");CreateBiTree(&T);
printf("选择您的操作:1:前序遍历二叉树,2:中序遍历二叉树,3:后序遍历二叉树,4:层次遍历二叉树,5:二叉树的深度,6:遍历所有叶子结点,7:遍历所有叶子结点并输出,8:退出\n");
int KEY;
while(1)
{
printf(">>输入您的选择:");
scanf("%d",&KEY);
switch(KEY)
{
case 1:printf("********************************************\n");
printf("前序遍历二叉树:");PreOrderTraverse(T);
printf("\n********************************************\n");break;
case 2:printf("********************************************\n");
printf("中序遍历二叉树:");InOrderTraverse(T);
printf("\n********************************************\n");break;
case 3:printf("********************************************\n");
printf("后序遍历二叉树:");PostOrderTraverse(T);
printf("\n********************************************\n");break;
case 4:printf("********************************************\n");
printf("层次遍历二叉树:");LevelOrderTraverse(T);
printf("\n********************************************\n");break;
case 5:printf("********************************************\n");
printf("二叉树的深度:%d",BiTreeDepth(T));
printf("\n********************************************\n");break;
case 6:printf("********************************************\n");
printf("遍历所有叶子结点个数:%d",CountLeaf(T));
printf("\n********************************************\n");break;
case 7:printf("********************************************\n");
printf("遍历所有叶子结点并输出:");Leaf(T);
printf("\n********************************************\n");break;
case 8:exit(1);break;
default:printf("无效选项!\n**********************************");break;
}
}
}
{
BiTree T;
printf("请创建一个二叉树\n");CreateBiTree(&T);
printf("选择您的操作:1:前序遍历二叉树,2:中序遍历二叉树,3:后序遍历二叉树,4:层次遍历二叉树,5:二叉树的深度,6:遍历所有叶子结点,7:遍历所有叶子结点并输出,8:退出\n");
int KEY;
while(1)
{
printf(">>输入您的选择:");
scanf("%d",&KEY);
switch(KEY)
{
case 1:printf("********************************************\n");
printf("前序遍历二叉树:");PreOrderTraverse(T);
printf("\n********************************************\n");break;
case 2:printf("********************************************\n");
printf("中序遍历二叉树:");InOrderTraverse(T);
printf("\n********************************************\n");break;
case 3:printf("********************************************\n");
printf("后序遍历二叉树:");PostOrderTraverse(T);
printf("\n********************************************\n");break;
case 4:printf("********************************************\n");
printf("层次遍历二叉树:");LevelOrderTraverse(T);
printf("\n********************************************\n");break;
case 5:printf("********************************************\n");
printf("二叉树的深度:%d",BiTreeDepth(T));
printf("\n********************************************\n");break;
case 6:printf("********************************************\n");
printf("遍历所有叶子结点个数:%d",CountLeaf(T));
printf("\n********************************************\n");break;
case 7:printf("********************************************\n");
printf("遍历所有叶子结点并输出:");Leaf(T);
printf("\n********************************************\n");break;
case 8:exit(1);break;
default:printf("无效选项!\n**********************************");break;
}
}
}
int PreOrderTraverse(BiTree T)//先序遍历
{
if(T==0)
return;//递归退出条件
printf("%c",T->data);//显示结点数据,并更改为其他对结点操作
PreOrderTraverse(T->lchild);//再先序遍历左子树
PreOrderTraverse(T->rchild);//最后先序遍历右子树
}
int InOrderTraverse(BiTree T)//中序遍历
{
if(T==0)
return;
InOrderTraverse(T->lchild);//先遍历左子树
printf("%c",T->data);//再遍历根结点
InOrderTraverse(T->rchild);//最后遍历右子树
}
int PostOrderTraverse(BiTree T)//后序遍历
{
if(T==0)
return;
PostOrderTraverse(T->lchild);//先遍历左子树
PostOrderTraverse(T->rchild);//后遍历右子树
printf("%c",T->data);//最后遍历根结点
}
{
if(T==0)
return;//递归退出条件
printf("%c",T->data);//显示结点数据,并更改为其他对结点操作
PreOrderTraverse(T->lchild);//再先序遍历左子树
PreOrderTraverse(T->rchild);//最后先序遍历右子树
}
int InOrderTraverse(BiTree T)//中序遍历
{
if(T==0)
return;
InOrderTraverse(T->lchild);//先遍历左子树
printf("%c",T->data);//再遍历根结点
InOrderTraverse(T->rchild);//最后遍历右子树
}
int PostOrderTraverse(BiTree T)//后序遍历
{
if(T==0)
return;
PostOrderTraverse(T->lchild);//先遍历左子树
PostOrderTraverse(T->rchild);//后遍历右子树
printf("%c",T->data);//最后遍历根结点
}
int BiTreeDepth(BiTree T)//求二叉树深度,见笔记,利用递归完成
{
int i,j;
if(!T)
return 0;
if(T->lchild)
i=BiTreeDepth(T->lchild);
else
i=0;
if(T->rchild)
j=BiTreeDepth(T->rchild);
else
j=0;
return i>j?i+1:j+1;
}
{
int i,j;
if(!T)
return 0;
if(T->lchild)
i=BiTreeDepth(T->lchild);
else
i=0;
if(T->rchild)
j=BiTreeDepth(T->rchild);
else
j=0;
return i>j?i+1:j+1;
}
int LevelOrderTraverse(BiTree T)//层次遍历
{
BiTree Queue[maxsize];//数组指针
int Front,Rear;
if(T==NULL)
return 0;
Front=-1;
Rear=0;
Queue[Rear]=T;
while(Front!=Rear)
{
Front++;
printf("%c",Queue[Front]->data);//访问队头结点的数据域
if(Queue[Front]->lchild!=NULL)//将队头结点的左孩子结点入队
{
Rear++;
Queue[Rear]=Queue[Front]->lchild;
}
if(Queue[Front]->rchild!=NULL)//将队头结点的右孩子结点入队
{
Rear++;
Queue[Rear]=Queue[Front]->rchild;
}
}
}
{
BiTree Queue[maxsize];//数组指针
int Front,Rear;
if(T==NULL)
return 0;
Front=-1;
Rear=0;
Queue[Rear]=T;
while(Front!=Rear)
{
Front++;
printf("%c",Queue[Front]->data);//访问队头结点的数据域
if(Queue[Front]->lchild!=NULL)//将队头结点的左孩子结点入队
{
Rear++;
Queue[Rear]=Queue[Front]->lchild;
}
if(Queue[Front]->rchild!=NULL)//将队头结点的右孩子结点入队
{
Rear++;
Queue[Rear]=Queue[Front]->rchild;
}
}
}
int CountLeaf(BiTree T)//求所有叶子结点个数
{
int m,n;
if(T==NULL) return 0;
if(T->lchild==NULL&&T->rchild==NULL) return 1;
else
{
m=CountLeaf(T->lchild);
n=CountLeaf(T->rchild);
return m+n;
}
}
int Leaf(BiTree T)//求所有叶子结点
{
if(T!=NULL)
{
if(T->lchild==NULL&&T->rchild==NULL)
printf("%c",T->data);
Leaf(T->lchild);
Leaf(T->rchild);
}
}