成绩:
学生姓名: 学号: 时间:
- 实验名称:
- 实现二叉树的各种遍历算法
- 求二叉树中的结点个数,叶子结点个数,某结点的层次
- 实验内容:
(1)编写一个程序实现二叉树的先序遍历,中序遍历,后序遍历的递归和非递归算法,以及层次遍历的算法,并对所给二叉树b给出求解结果
(2)编写一个程序实现以下功能,并对所给二叉树进行验证
-
- 输出二叉树的结点个数
- 输出二叉树的叶子结点个数
- 求二叉树中指定结点值的结点的层次
- 算法及UML图:
算法:
实验一:
void CreatTree(BTnode *&b,char *str) //创建二叉树
{
BTnode *St[Maxsize],*p;
int to=-1,k,j=0;
char ch;
b=NULL; //初始时二叉链为空
ch=str[j];
while(ch!='\0')
{
switch(ch)
{
case '(':to++;St[to]=p;k=1;break;
case ')':to--;break;
case ',':k=2;break;
default:p=(BTnode *)malloc(sizeof(BTnode));
p->data=ch;
p->lchild=p->rchild=NULL;
if(b==NULL)
b=p;
else
{
switch(k)
{
case 1:St[to]->lchild=p;break;
case 2:St[to]->rchild=p;break;
}
}
}
j++;
ch=str[j];
}
}
void DispBTree(BTnode *b) //输出二叉树
{
if(b!=NULL)
{
printf("%c",b->data);
if(b->lchild!=NULL ||b->rchild!=NULL)
{
printf("(");
DispBTree(b->lchild);
if(b->rchild!=NULL) printf(",");
DispBTree(b->rchild);
printf(")");
}
}
}
void Preorder(BTnode *b) //前序遍历
{
if(b!=NULL)
{
printf("%c",b->data);
Preorder(b->lchild);
Preorder(b->rchild);
}
}
void Inorder(BTnode *b) //中序遍历
{
if(b!=NULL)
{
Inorder(b->lchild);
printf("%c",b->data);
Inorder(b->rchild);
}
}
void Postorder(BTnode *b) //后序遍历
{
if(b!=NULL)
{
Postorder(b->lchild);
Postorder(b->rchild);
printf("%c",b->data);
}
}
void Preorder1(BTnode* b)
{
BTnode * s[Maxsize],*p;
int top=-1;
if(b!=NULL)
{
top++;
s[top]=b;
while(top>-1)
{
p=s[top];
top--;
printf("%c",p->data);
if(p->rchild!=NULL)
{
top++;
s[top]=p->rchild;
}
if(p->lchild!=NULL)
{
top++;
s[top]=p->lchild;
}
}
}
}
void Inorder1(BTnode* b)
{
BTnode *s[Maxsize],*p;
int top=-1;