实验目的:
1.熟悉树的各种存储结构的特性
2.掌握采用二叉链表作为存储结构的树的相关算法
实验内容:
***1.按先序序列构造二叉链表(CreatBiTree),
***2.实现函数用于计算结点的总个数(CountNode)
***3.实现函数用于计算叶子结点的个数(CountLeaf)
***4. 实现函数(InOrder)用于输出中序遍历序列
5.实现函数(PostOrder)用于输出后序遍历序列
6.函数(NRPreOrder)用于非递归方法输出先序序列//可选做
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct node
{ char data;
struct node *lchild,*rchild;
}BitNode,*BitTree;
/*按先序遍历序列输入树上的元素,生成二叉链表*/
void creatTree(BitTree &T)
{
char ch; /*ch代表输入的元素*/
scanf("%c",&ch);
/*用空格来扩展树,所以读到空格代表没有孩子结点*/
if(ch==' ') T=NULL;
else
{T=(BitNode *)malloc(sizeof(BitNode));
T->data=ch;
creatTree(T->lchild);
creatTree(T->rchild);
}
}
/*输出中序遍历序列*/
void inorder(BitTree T)
{if(T!=NULL)
{
inorder(T->lchild);
printf("%c",T->data);
inorder(T->rchild);
}
}
/*输出后序遍历序列*/
void postorder(BitTree T)
{if(T!=NULL)
{postorder(T->lchild);
postorder(T->rchild);
printf("%c",T->data);
}
}
/*计算结点的总个数*/
int nodes(BitTree T)
{
int num1,num2;
if(T==NULL) return 0;
else
{num1=nodes(T->lchild);
num2=nodes(T->rchild);
return (num1+num2+1 );
}
}
/*计算叶子结点的个数*/
int leafs(BitTree T)
{ int num1,num2;
if(T==NULL) return 0;
else if(T->lchild==NULL&&T->rchild==NULL) return 1;
else {num1=leafs(T->lchild);
num2=leafs(T->rchild);
return (num1+num2);
}
}
void ShowSelect()
{ printf("\n\n请选择要执行的操作:\n");
printf("-------------------------\n");
printf(" 1----先序序列构建二叉链表\n");
printf(" 2----计算二叉树结点总个数\n");
printf(" 3----计算叶子结点总个数\n");
printf(" 4----输出中序遍历序列\n");
printf(" 5----输出后续遍历序列\n");
printf(" 0---- exit!\n");
printf("-------------------------\n");
printf("please input number 0~~6 \n\n");
}
void main()
{ BitTree tree=NULL;
int num;
while(1)
{ ShowSelect();
scanf("%d",&num);
getchar();
switch(num){
case 1:{printf("请按先序序列建立二叉链表,以字符空格作为无孩子结点标志");
creatTree(tree);
break;
}
case 2:{ int num;
num=nodes(tree);
printf("树的结点总个数为%d",num);
break;
}
case 3:{ int num;
num=leafs(tree);
printf("\n树的叶子结点个数为%d",num);
break;
}
case 4:{printf("\n中序遍历序列为:");
inorder(tree);
break;
}
case 5:{printf("\n后序遍历序列为:");
postorder(tree);
break;
}
case 0:
exit(0);
}
}
}