实验内容:
1、按照前序次序建立一棵二叉树;
2、用前、中、后序递归遍历的方法遍历二叉树;
3、求二叉树的深度;
4、求二叉树的所有结点数;
实验基本要求:
掌握二叉树的链式存储结构的建立方法和对二叉树的各种操作算法
#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
typedef char ElemType;
/*二叉树的链式存储结构*/
typedef struct node
{
ElemType data;
struct node *lchild;
struct node *rchild;
} BTNode;
/*创建二叉树CreateBTNode(*b,*str) */
void CreateBTNode(BTNode * &b,char *str)/*由str串创建二叉链*/
{
BTNode *St[MaxSize],*p=NULL;
int top=-1,k,j=0;
char ch;
b=NULL; /*建立的二叉树初始时为空*/
ch=str[j];
while (ch!='\0') /*str未扫描完时循环*/
{
switch(ch)
{
case '(':top++;St[top]=p;k=1; break; /*为左孩子结点*/
case ')':top--;break;
case ',':k=2; break;
/*为孩子结点右结点*/
default:p=(BTNode *)malloc(sizeof(BTNode));
p->data=ch;p->lchild=p->rchild=NULL;
if (b==NULL) /**p为二叉树的根结点*/
b=p;
else /*已建立二叉树根结点*/
{ switch(k)
{
case 1:St[top]->lchild=p;break;
case 2:St[top]->rchild=p;break;
}
}
}
j++;
ch=str[j];
}
}
/*先序遍历的递归算法*/
void PreOrder(BTNode *b)
{
if(b!=NULL)
{
printf("%c",b->data);
PreOrder(b->lchild);
PreOrder(b->rchild);
}
}
/*中序遍历的递归算法*/
void InOrder(BTNode *b)
{
if(b!=NULL)
{
PreOrder(b->lchild);
printf("%c",b->data);
PreOrder(b->rchild);
}
}
/*后序遍历的递归算法*/
void PostOrder(BTNode *b)
{
if(b!=NULL)
{
PreOrder(b->lchild);
PreOrder(b->rchild);
printf("%c",b->data);
}
}
/*求高度BTNodeDepth(*b)*/
int BTNodeDepth(BTNode *b)
{ int lchilddep,rchilddep;
if (b==NULL) return(0); /*空树的高度为0*/
else
{ lchilddep=BTNodeDepth(b->lchild);
/*求左子树的高度为lchilddep*/
rchilddep=BTNodeDepth(b->rchild);
/*求右子树的高度为rchilddep*/
return(lchilddep>rchilddep)?(lchilddep+1):(rchilddep+1);
}
}
/*求二叉树的所有结点个数*/
int Nodes(BTNode *b)
{
int num1,num2;
if(b==NULL) /*树空的情况*/
return 0;
else if(b->lchild==NULL&&b->rchild==NULL)/*为叶子结点的情况*/
return 1;
else
{
num1=Nodes(b->lchild);
num2=Nodes(b->rchild);
return(num1+num2+1); /*返回左右子树结点数加1*/
}
}
void main()
{
BTNode *b;
CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
printf("用括号表示法来表示这棵二叉树:“A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”");printf("\n\n");
printf("(1)二叉树的深度:%d\n",BTNodeDepth(b));printf("\n");
printf("(2)二叉树的所有结点个数:%d\n",Nodes(b));printf("\n");
printf("(3)二叉树先序遍历序列:");PreOrder(b);printf("\n\n");
printf("(4)二叉树中序遍历序列:");InOrder(b);printf("\n\n");
printf("(5)二叉树后序遍历序列:");PostOrder(b);printf("\n\n");
printf("\n");
}