实验三 二叉树操作
二、实验目的
2. 掌握二叉树的结构特征,以及各种存储结构的特点及使用范围。
3. 掌握用指针类型描述、访问和处理二叉树的运算;
4. 掌握栈或队列的使用。
三、实验题目
本实验要求实现以下功能:
1.按前序次序建立一颗二叉树,以‘#’表示空。
2.中序、后序遍历该二叉树,输出遍历序列。
3.求出该二叉树的深度并输出,或求出该二叉树的叶子数目并输出。
4.试以栈为辅助存储结构实现二叉树的前序非递归算法或以队列为辅助存储结构实现二叉树的层次遍历算法。(选做)
[测试数据]:
输入以下字符串,建立二叉树:ABC##DE#G##F###
输出中序遍历序列应为:CBEGDFA
输出后序遍历序列应为:CGEFDBA
输出二叉树的深度应为:5
输出二叉树的叶子数目应为:3
1.实验题目。
2.程序中使用的数据结构及符号说明。
3.打印一份源程序并附上注释。
4.打印程序运行时的初值和运行结果,画出该二叉树的形态。
#include<stdio.h>
#include<stdlib.h>
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
BiTree Create(BiTree T)//先序创建二叉树
{
char ch;
ch=getchar();
if(ch=='#')
T=0;
else
{
if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
printf("Error!");
T->data=ch;
T->lchild=Create(T->lchild);
T->rchild=Create(T->rchild);
}
return T;
}
void InOrderPrint(BiTree T)//中序输出二叉树
{
if(T)
{
InOrderPrint(T->lchild);
printf("%c",T->data);
InOrderPrint(T->rchild);
}
}
void PostOrderPrint(BiTree T)//后序输出二叉树
{
if(T)
{
PostOrderPrint(T->lchild);
PostOrderPrint(T->rchild);
printf("%c",T->data);
}
}
int Depth(BiTree T)//计算二叉树深度
{
int dep=0,depl,depr;
if(!T)
dep=0;
else
{
depl=Depth(T->lchild);
depr=Depth(T->rchild);
dep=1+(depl>depr?depl:depr);
}
return dep;
}
int Sumleaf(BiTree T)//计算二叉树叶子数
{
int sum=0,m,n;
if(T)
{
if((!T->lchild)&&(!T->rchild))
sum++;
m=Sumleaf(T->lchild);
sum+=m;
n=Sumleaf(T->rchild);
sum+=n;
}
return sum;
}
void main()
{
BiTree T=0;
int sum,dep;
printf("先序输入二叉树(以‘#’表示空)/n");
T=Create(T);
printf("中序遍历序列:/n");
InOrderPrint(T);
printf("/n后序遍历序列:/n");
PostOrderPrint(T);
sum=Sumleaf(T);
printf("/n二叉树的深度:%d",sum);
dep=Depth(T);
printf("/n二叉树的叶子数目:%d/n",dep);
}